Vue 基础篇

一、框架与库的区别

  • JQ库->DOM(DOM操作) + Ajax请求
  • art-template库->模板引擎
  • 框架 -> 全方位、功能齐全
    • 简易的DOM体验 + 发请求 + 模板引擎 + 路由功能 + ...
  • 代码上的不同:
    • 一般使用库:调用某个函数,自己可以把控库的代码
    • 一般使用框架:其框架在帮我们运行已编写好的代码
      • 框架:初始化自身的一些行为
      • 执行你所编写的代码
      • 施放一些资源

库:小而精

框架:大而全 ( 框架包含了各种库 )

二、起步

  • 引包

    • 直接用 <script>引入
    • CDN
    • NPM
  1. npm install --yes
  2. npm install vue --save ( npm install vue -S )
  • 创建实例化对象 new Vue( options 对象 )

    • options

      • el : 目的地( 选择器 )
      • data : 数据属性 ( 既可以是一个对象,也可以是一个函数 )
        • 数据驱动试图:数据发生改变时,视图 发生改变。
        • 除了数据属性,vue 实例还暴露了一些有用的实例属性和方法。他们都有前缀 $,如: $el,$data 。
      • template : 模板内容
        • 优先级:如果 template 中定义了内容,那么有限加载 template;反之,加载 el 挂载的模板
  • vue的模板语法:
    • {{}} 双大括号插值 同 react 中的 {}
    • {{ 表达式 }}
      • 对象 ( 不要连续三个大括号 {{ { key : value } }} )
      • 字符串 {{ ’XXX‘ }}
      • 判断后的布尔值 {{ true }}
      • 三元表达式 {{ true ? '正确' : '错误' }}
    • 可以用于页面中简单粗暴的调试
    • 注意:必须在 data 这个函数中返回的对象中声明
  • 设计模式:MVC 与 MVVM
    • MVC:Model( 数据模型 )、View( 视图 )、Controller( 控制器 )

      • 数据不是主动展示到 视图 上的,它是靠 控制器 取到 model 然后展示到 view。
    • MVVM:Model、View、ViewModel
      • vue的设计模式为MVVM, 只关注的是视图层

三、指令 ( v-xxx )

  • 在vue中提供了一些对于页面+数据的更为方便的输出,这些操作就叫做指令

    • 比如html页面中的属性 <div v-xxx></div>
    • 指令中封装了一些DOM行为,结合属性作为一个暗号,暗号有对应的值,根据不同的值,框架会进行相关的DOM操作的绑定。
  • 常用指令
    • v-text:元素的InnerText属性,其实就是给元素的innerText赋值,必须是双标签,跟{{}}效果是一样的,使用较少。
    • v-html:元素的InnerHtml,其实就是给元素的innerHtml赋值
    • v-if:判断是否插入这个元素,相当于对元素的销毁和创建。appendChild()、removeChild()
    • v-else-if
    • v-else
    • v-show:隐藏元素,如果确定要隐藏,会给元素的style加上 display:none;,是基于css样式的切换。
  • v-if 与 v-show 的区别 ( 官网解释 )
    • v-if是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当的被销毁和重建。
    • v-if也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
    • 相比之下,v-show就简单的多——不管初始条件是什么,元素总会被渲染。并且只是简单的基于css进行 显/隐 切换。
    • 一般来说,v-if有更高的切换开销,而v-show有更高的初始渲染开销。因此,如果需要非常频繁的切换,则使用v-show较好;如果在运行时条件很少改变,则使用v-if较好。
  • v-bind:绑定标签上的属性( 内置的属性和自定义的属性 ),v-bind:class="box",简写 :
  1. <div class="container" :class="{active: true}"></div>
  2. // 渲染为 DOM
  3. <div class="container active"></div>
  • v-on:v-on:原生事件名 = '函数名',简写@
  1. // html
  2. <div class="container" @click="clickHandler"></div>
  3. // js
  4. methods:{
  5. clickHandler(e){
  6. console.log(this);
  7. }
  8. }
  • v-for:v-for="item,index in arr"
  1. <ul>
  2. <li v-for="item,index in list">
  3. {{index}}--{{item}}
  4. </li>
  5. </ul>
  • v-model:数据双向绑定

    • 只会体现在UI空间中,只能应用在有value属性的元素。
  1. <input v-model="msg">
  2. // 等同于
  3. <input :value="msg" @input="msg = $event.target.value" />

那么 v-model 其实就是 v-bindv-on 的语法糖。

四、组件

1.局部组件

局部组件使用打油诗:声子挂子用子

声明子组件;父组件挂载子组件;父组件使用子组件。

  1. // 局部组件的声明
  2. var App = {
  3. data(){
  4. return{
  5. }
  6. },
  7. template:`
  8. <div>我是入口组件</div>
  9. `
  10. }
  11. // vue实例
  12. new Vue({
  13. el:"",
  14. data(){
  15. },
  16. // 挂载子组件
  17. components:{
  18. App
  19. },
  20. // 父组件直接可以使用
  21. template:`<App />`
  22. })

组件命名:

​ 1.短横线分隔 命名:当引用组件时,也要使用 短横线分隔 形式。( 如: )

​ 2.驼峰式命名:当引用组件时,可以使用 短横线分隔 形式或者 驼峰 形式。( 如: 或 )

​ [注]:直接在DOM( 即非字符串的模板 )中使用时只有 短横线分隔 形式是有效的。

​ [建议]:命名时用 驼峰 形式,使用时用 短横线分隔 形式。

2.全局组件

Vue.component("组件名", options)

  1. // 全局组件声明
  2. // 第一个参数是组件的名字,第二个参数是options配置项
  3. Vue.component("Vbtn", {
  4. template:`
  5. <button>按钮</button>
  6. `
  7. })
  8. // 全局组件使用
  9. var App = {
  10. template:`
  11. <div>
  12. ...
  13. <Vbtn />
  14. </div>
  15. `
  16. }

五、组件通信

1.通过 prop 往子组件通信
  • 1.Parent 2.Child
  • 先给父组件中绑定自定义的属性
  1. Vue.component("Parent", {
  2. data(){
  3. return{
  4. msg:"我是父组件的数据"
  5. }
  6. },
  7. template:`
  8. <div>
  9. <p>我是父组件</p>
  10. <Child :childData="msg" />
  11. </div>
  12. `
  13. })
  • 在子组件中使用 props 接收父组件传递的数据

  • 在子组件中任意使用

  1. Vue.component("Child", {
  2. template:`
  3. <div>
  4. <p>我是子组件</p>
  5. <input type="text" v-model="childData" />
  6. </div>
  7. `,
  8. props:["childData"]
  9. })
2.通过 事件 向父组件发送消息
  • 在父组件绑定自定义的事件
  • 在子组件中 触发原生的事件,在函数中使用 $emit 触发其父组件中自定义的事件
    • $emit("自定义的事件名", "消息")
  1. // Child
  2. Vue.component("Child", {
  3. template:`
  4. <div>
  5. <p>我是子组件</p>
  6. <input type="text" v-model="childData" @input="changeValue(childData)" />
  7. </div>
  8. `,
  9. props:["childData"],
  10. methods:{
  11. changeValue(val){
  12. // 自定义的事件一定要通过 this.$emit() 去触发
  13. // $emit("自定义的事件名", "消息")
  14. this.$emit(childHandler, val)
  15. }
  16. }
  17. })
  18. // Parent
  19. Vue.component("Parent", {
  20. data(){
  21. return{
  22. msg:"我是父组件的数据"
  23. }
  24. },
  25. template:`
  26. <div>
  27. <p>我是父组件</p>
  28. <Child :childData="msg" @childHandler="childHandlerFn" />
  29. </div>
  30. `,
  31. methods:{
  32. childHandlerFn(val){
  33. console.log(val);
  34. }
  35. }
  36. })

六、插槽 slot

插槽:内置组件 slot,作为承载分发内容的出口

  1. /* 模拟 elementUI 按钮组件的实现 */
  2. // 子组件
  3. Vue.component("Vbtn", {
  4. template:`
  5. <button class="default" :class="type">
  6. <slot>按钮</slot>
  7. </button>
  8. `,
  9. props:["type"]
  10. })
  11. // 父组件
  12. var App = {
  13. template:`
  14. <div>
  15. ...
  16. <Vbtn type="primary">登陆</Vbtn>
  17. <Vbtn type="success">注册</Vbtn>
  18. </div>
  19. `
  20. }
具名插槽
  1. // 子组件
  2. Vue.component("liItem", {
  3. template:`
  4. <li>
  5. 第一个槽
  6. <slot name="idx-1"></slot>
  7. 第二个槽
  8. <slot name="idx-2"></slot>
  9. </li>
  10. `
  11. })
  12. // 父组件
  13. var App = {
  14. template:`
  15. <div>
  16. <ul>
  17. <liItem>
  18. <h1 slot="idx-1">我是第一个槽</h1>
  19. <h3 slot="idx-2">我是第二个槽</h3>
  20. </liItem>
  21. </ul>
  22. </div>
  23. `
  24. }

七、过滤器

  • 过滤器的作用:为页面中的数据进行添油加醋的功能
  • 分类
    • 局部过滤器
    • 全局过滤器
  1. /* 局部过滤器 */
  2. // 1.声明过滤器
  3. // 2. {{ 数据 | 过滤器的名字 }}
  4. var App = {
  5. data(){
  6. return{
  7. price:0,
  8. msg:"hello filter"
  9. }
  10. },
  11. template:`
  12. <div>
  13. <input type="number" v-model="price" />
  14. <!-- 使用过滤器 -->
  15. <h2>{{ price | myCurPrice }}</h2>
  16. <h3>{{ price | myReverse }}</h3>
  17. </div>
  18. `,
  19. filters:{
  20. // 声明过滤器
  21. myCurPrice: function(val){
  22. return "¥" + val
  23. }
  24. }
  25. }
  26. /* 全局过滤器 */
  27. // 字符串反转过滤器
  28. Vue.filter("myReverse", function(val){
  29. return val.split("").reverse().join("");
  30. })

{{ 数据 | 过滤器的名字(可以传值) }}

例:

​ {{ price | myReverse("这里是传入的值") }}

​ // 其中 arg 就是传入的值

​ Vue.filter("myReverse", function(val, arg){
​ return val.split("").reverse().join("");
​ })

八、watch 监听

watch 监听的是单个属性

基本的数据类型 -- 简单监视

复杂的数据类型 -- 深度监视

  • 监听简单数据类型
  1. new Vue({
  2. el:"",
  3. data(){
  4. return{
  5. msg : ''
  6. }
  7. },
  8. watch:{
  9. msg: function(newVal, oldVal){
  10. console.log(newVal, oldVal);
  11. }
  12. }
  13. })
  • 监听复杂数据类型 obj, arr, 等 -- 深度监视
  1. new Vue({
  2. el:"",
  3. data(){
  4. return{
  5. userList : [{name:"jack"}]
  6. }
  7. },
  8. watch:{
  9. userList: {
  10. deep:true, // 深度监视
  11. handler: function(newVal, oldVal){
  12. console.log(newVal, oldVal);
  13. }
  14. }
  15. }
  16. })

九、计算属性

  • 计算属性 getter
  1. // html
  2. <img :src="getCurSrc" />
  3. <ul>
  4. <li v-for="item,index in dataList" @click="clickHandler(index)" :class="{active: curIdx == index}">{{ index }}</li>
  5. </ul>
  6. // js
  7. new Vue({
  8. el:"",
  9. data(){
  10. return{
  11. dataList:[{imgsrc:'1'},{imgsrc:'2'},{imgsrc:'3'}],
  12. curIdx : 0
  13. }
  14. },
  15. computed:{
  16. // 计算属性默认只有 getter
  17. getCurSrc: function(){
  18. return this.dataList[this.curIdx].imgsrc
  19. }
  20. },
  21. methods:{
  22. clickHandler(index){
  23. this.curIdx = index;
  24. }
  25. }
  26. })
  • 计算属性 setter
  1. // js
  2. new Vue({
  3. computed:{
  4. getCurSrc: {
  5. set: function(newVal){
  6. console.log(newVal);
  7. this.curIdx = newVal;
  8. },
  9. get: function(){
  10. return this.dataList[this.curIdx].imgsrc
  11. }
  12. }
  13. },
  14. methods:{
  15. clickHandler(index){
  16. // 点语法 set方法 和 get方法
  17. // getter 方法
  18. console.log(this.getCurSrc);
  19. // 调用set方法
  20. this.getCurSrc = index;
  21. }
  22. }
  23. })

十、生命周期

  • beforeCreate:组件创建之前会调用
  • created:组件创建之后 会调用
    • 在created这个方法中可以操作后端的数据,数据驱动视图
    • 应用:发起Ajax请求
  • beforeMount:挂载数据到 DOM 之前会调用
  • mounted:挂载数据到 DOM 之后会调用
    • 应用:操作DOM
  • beforeUpdate:在更新DOM之前 调用该钩子
    • 应用:可以获取原始的DOM
  • updated:在更新DOM之后 调用该钩子
    • 应用:可以获取最新的DOM
  • beforeDestroy:组件销毁之前会调用
  • destroyed:组件销毁之后会调用

vue 内置组件 <keep-alive></keep-alive>:能在组件的切换过程中将状态保留在内存中,防止重复渲染DOM。

  • activated:组件被激活了
  • deactivated:组件被停用了

Vue 基础篇的更多相关文章

  1. Vue 基础篇---computed 和 watch

    最近在看前端 Vue方面的基础知识,虽然前段时间也做了一些vue方面的小项目,但总觉得对vue掌握的不够 所以对vue基础知识需要注意的地方重新撸一遍,可能比较零碎,看到那块就写哪块吧 1.vue中的 ...

  2. vue基础篇---vue组件

    vue模块第一篇,因为公司马上要用到这vue开发.早就想好好看看vue了.只有实际工作中用到才会进步最快.vue其他的简单指令就不多讲了,没啥意思,网上一大堆.看w3c就ok. 组件这个我个人感觉坑蛮 ...

  3. vue基础篇---路由的实现《2》

    现在我们来实现这样一个功能: 一个页面,包含登录和注册,点击不同按钮,实现登录和注册页切换: 编写父组件 index.html <div id="app"> <s ...

  4. vue基础篇---vue组件《2》

    定义全局组件 我们通过Vue的component方法来定义一个全局组件. <div id="app"> <!--使用定义好的全局组件--> <coun ...

  5. vue基础篇---watch监听

    watch可以让我们监控一个值的变化.从而做出相应的反应. 示例: <div id="app"> <input type="text" v-m ...

  6. vue基础篇---生命周期

    每个钩子函数都在啥时间触发 beforeCreate 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用. created 实例已经创建完成之 ...

  7. vue基础篇---路由的实现

    路由可以有两种实现方式,一种是标签形式的,一种是js实现. 标签: <router-link to='/city'> 北京 </router-link> 标签还有另外一种实现方 ...

  8. vue基础篇---修改对象或数组的值,页面实时刷新

    这个问题估计大家很难想到,如果一个数组[1,2,3,4],然后我们v-for遍历,我们改变数组的值,arr[1] = 5 ,难道不应该改变么?按理说根据vue的特性应该是改变的,但是事实上确实数组已经 ...

  9. vue基础篇---class样式绑定

    因为class的绑定在实际的工作中会经常用到.所以特意记录一下,有好几种方法. 对象绑定方法,另外一个值来控制显示隐藏 <!DOCTYPE html> <html lang=&quo ...

随机推荐

  1. MySQL查询结果保存到本地

    #!/bin/bash mysql -h<公网IP> -P<端口号> -u<用户名> -p<密码> -D<指定数据库> >/Users ...

  2. Pyhton学习——Day9(阶段性练习)

    # 1.文件内容如下,标题为:姓名,性别,年纪,薪资## egon male 18 3000# alex male 38 30000# wupeiqi female 28 20000# yuanhao ...

  3. Java基础之Colloction

    0 引言 以下是介绍Java有关集合类,以及对应每个类的用途,同时进行比较集合类的不同特点来让我们深入了解. 1 Collction接口 Collection是最基本的集合接口,一个Collectio ...

  4. JSP获取json格式的数据报错 Uncaught SyntaxError: Unexpected identifier

    后台json字符串是 {"id":"cmdb_ci.`fully_qualified_domain_name`","field":" ...

  5. Git diff 代码比较的高级技巧

    Git diff 代码比较的高级技巧 作者:offbye 出处:http://blog.csdn.net/offbye/article/details/6592563 Git是使用branch来管理不 ...

  6. 小学生都能学会的python(深浅拷贝)

    小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...

  7. [转]Python常用字符串

    转自:http://blog.csdn.net/daemonpei/article/details/6325762 字符串相关操作: + :string1+string2 #联接字符串,将后一个串链接 ...

  8. JavaScript div 上下运动实例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 我一不小心把ubuntu里的ps这样的命令删掉了,应该怎么重装呢

    sudo apt-get --reinstall install procps    

  10. ASP.NET-优化websit

    如何优化一个网站 1.如果是数据库的问题则尝试添加索引.优化SQL语句,如果是算法的问题,则优化算法. 2.如果对于一些不经常改动的页面可以使用静态页技术! 3.对于一些数据不需要及时更新的而且取数据 ...