1、Vue两大特性
数据驱动视图
数据的变化会驱动视图自动更新
好处:程序员只把数据维护好,那么页面结构会被Vue自动渲染出来。
双向数据绑定
在网页中,form表单负责采集数据,Ajax负责提交数。
js数据的变化,会被自动渲染到页面上
页面上表单采集的数据发生变化的时候,会被Vue自动获取,并更新到js数据中。
注意: 数据驱动视图和双向绑定的底层原量是MVVM(Model数据源、View视图、ViewModel。其中,ViewModel 是Vue的实例)
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
   <!--1.导入Vue的库文件-->
   <script src="lib/vue-2.6.12.js"></script>
</head>
<body>
   <div id="app">
   
   
   </div>
   <!--2.创建Vue的实例对象-->
   <script>
   //创建Vue的实例
       const vm = new Vue({
           // el属性是固定写法。
           // 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。
           el: "#app" ,
           data:{
               username:"zhangsan",
           }
       })
   </script>
</body>
</html>
2、vue指令
**指令(Directives)**是Vue为开发者提供的 模板语法,用于 辅助开发者渲染页面的基本结构。
Vue中的指令按照不同的用途,可分为6大类:
内容渲染指令
属性绑定指令
事件绑定指令
双向绑定指令
条件渲染指令
列表渲染指令
指令是Vue开发中最基础、最常吸入、最简单的知识点。
2.1、内容渲染指令
内容渲染指令 用来辅助开发者 渲染 DOM 元素的文本内容 。常用的内容渲染指令有如下3 个:
v-text
{{ }}
v-html
(1)v-text
<p v-text="username"></p>
<!-- 注意:默认文本 “性别” 会被gender的值覆盖掉 -->
<p v-text="gender">性别</p>
缺点:
v-text 指令会覆 盖标签内部原本的内容,缺点很明显,实际使用少。
(2){{ }} :插值表达式
vue 提供的 {{ }} 语法,专门用来解决 v-text 会覆盖默认文本内容的问题。这种 {{ }} 语法的专业名称是 插值表达式 (英文名为:Mustache)。
<p>姓名:{{username}}</p>
<p>性别:{{gender}}</p>
插值表达式 ,只是内容的占位符,实际开发中使用最多。
只有用在内容节点,无法用在属性节点。
(3)v-html
2.2、属性绑定指令
在vue中,可以使用v-bind:指令,为元素的属性动态绑定值。
简写是: 。
v-bind: 与 插值表达式的区别?
插值表达式 只能用在 内容节点,无法用在属性节点。
v-bind: 用于为元素的属性动态绑定值。
示例:
<img v-bind:src="vueImg" />
<hr>
<!-- VUE规定v-bind指定可简写为 : -->
VUE规定v-bind指定可简写<br>
<img  :src="vueImg" />
<script>
//创建Vue的实例
   const vm = new Vue({
       // el属性是固定写法。
       // 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。
       el: "#app" ,
       data:{           
           vueImg:"./images/vue.jpg"            
       }
   })
</script>
使用 Javascript 表达式
<div id="app">
   num=25+10
   表达式计算: {{num +10}}
   <hr>   
   num2=25+20
<input type="text"  v-bind:placeholder="num2 + 20" >
num2=25+ '-20'
<input type="text"  v-bind:placeholder="num2 + '-20'" >
</div>
<script>
//创建Vue的实例
   const vm = new Vue({       
       el: "#app" ,
       data:{
           num: 25,
           num2: 25,
       }
   })
</script>
2.3、事件绑定指令
vue 提供了 v-on 事件绑定指令,用来辅助程序员为DOM 元素绑定事件监听。
v-on 简写 @ 。如 v-on:click 可简写成 @click 。
常见的原生DOM 事件有 onclick、oninput、onkeyup ,替换为vue 的事件, 分别为:v-on:click 、v-on:input 、v-on:keyup 。
以 v-on:click 为例,v-on:click 简写成 @click。 语法格式如下:
<p> count 的值是{{ count }}</p>
<!--  语法格式为 v-on:事件=“事件处理函数的名称”   -->
<button v-on:click="add"> +1 </button>
示例:
<div id="app">
   
   <p> count 的值是{{ count }}</p>
   <button v-on:click="add"> +1 </button>
   <button v-on:click="sub"> -1 </button>
</div>
<script>
//创建Vue的实例
   const vm = new Vue({
       // el属性是固定写法。
       // 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。
       el: "#app" ,
       data:{
           count: 0,
       },
       // methods的作用,就是定义事件的处理函数
       methods:{
           add{
               vm.count+=1
               console.log(vm==this)               
               console.log(vm)
           },
           sub(){
               this.count-=1
           },
       }
   })
</script>
运行上面的代码,得到 vm 等于 this ,一般使用this 。
add 函数接收参数
<div id="app">
   
   <p> count 的值是{{ count }}</p>
   <button @:click="add(2)"> +1 </button>
   <button v-on:click="sub"> -1 </button>
</div>
<script>
//创建Vue的实例
   const vm = new Vue({
       // el属性是固定写法。
       // 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。
       el: "#app" ,
       data:{
           count: 0,
       },
       // methods的作用,就是定义事件的处理函数
       methods:{
           add(n){
               this.count+=n
               console.log(vm)
           },
           sub(){
               this.count-=1
           },
       }
   })
</script>
v-on:click 简写成 @click
<div id="app">
   
   <p> count 的值是{{ count }}</p>
   <button @click="add(2)"> +1 </button>
   <button @click="sub"> -1 </button>
</div>
<script>
//创建Vue的实例
   const vm = new Vue({
       // el属性是固定写法。
       // 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。
       el: "#app" ,
       data:{
           count: 0,
       },
       // methods的作用,就是定义事件的处理函数
       methods:{
           add(n){
               this.count+=n
               console.log(vm)
           },
           sub(){
               this.count-=1
           },
       }
   })
</script>
(1)事件内置的变量: $event
<div id="app">
   
   <p> count 的值是{{ count }}</p>
   <!--  当count是偶数时,加背景色,否则没有 -->
   <button @click="add(2,$event)"> +1 </button>
</div>
<script>
   const vm = new Vue({
       el: "#app" ,
       data:{
           count: 0,
       },
       methods:{
           add(n,event){
               this.count+=1
              // console.log(e)
               if(this.count%2==0){
                   event.target.style='background-color:red;'
               }else{
                   event.target.style=''
               }
           },
           sub(){
               this.count-=1
           },
       }
   })
</script>
(2)事件修饰符
件修饰符 说明
.prevent 阻止默认行为 (例如:阻止a 连接的跳转、阻止表单的提交等)
.stop 阻止事件冒泡
.capture 以捕获模式触发当前的事件处理函数
.once 绑定的事件只触发1次
.self 只有在 event.target 是当前元素自身时触发事件处理函数
@click.prevent
<a href="http://www.baidu.com"  @click.prevent="show" >跳转到百度首页</a>
1
@click.stop
<div  style="height:150px;background-color:orange;" @click="divHander">
   <button @click.stop="btnHander">按钮事件</button>
</div>
(3)按键修饰符
在 监听键盘事件 时,我们经常需要 判断详细的按键。此时,可以为 键盘相关的事件 添加 按键修饰符。
.esc 、 .enter
2.4、v-model 双向数据绑定指令
vue 提供了 v-model 双向数据绑定指令,用来辅助开发者在不操作DOM 的前提下,快速获取表单的数据。
只有表单数据 才能使用 v-model 指令:
input (text、radio、checkbox、…)
textarea
select
<div id="app">
  <p>用户名是 {{username}}</p>
  <input type="text" v-model="username">  
  
</div>
<script>
   const vm = new Vue({
        el: "#app" ,
        data:{
           username:'zhangsan',            
        },  
   })
</script>
示例2:(select 双向绑定)
<div id="app">
  <p>选中的省份是 {{province}}</p>
  <p>
     <input type="text" v-model="province">
  </p>
  <select v-model="province">
     <option>请选择</option>
     <option value="1">北京</option>
     <option value="2">河北</option>
     <option value="3">黑龙江</option>
  </select>
  
</div>
<script>
   const vm = new Vue({
        el: "#app" ,
        data:{            
           province:'',           
        },  
   })
</script>
v-model 与 v-bind: 的区别
说明:
v-model是双向绑定 ,v-bind: 是单向绑定 。
<div id="app">
   
  <p>用户名是 {{username}}</p>
  <input type="text" v-model="username">
 
  <p>用户名(v-bind)是 </p>
  <input type="text" :value="username">
  
</div>
<script>
   const vm = new Vue({
        el: "#app" ,
        data:{
           username:'zhangsan',           
        },  
   })
</script>
v-model指令的修饰符
修饰符 作用 示例
.number 自动将用户的输入值转为 数值类型 <input v-model.number="age" />
.trim 自动过滤用户输入的 首尾 空白字符 <input v-model.trim="msg" />
.lazy 在“change”时而非“input”时更新 <input v-model.lazy="msg" />
示例:
不使用 .number 时是字符串拼接,加上 .number 是数值相加。
<div id="app">
  <input type="text" v-model.number="n1">
+
  <input type="text" v-model.number="n2">
  <p>
     {{ n1 + n2 }}
  </p>
</div>
<script>
   const vm = new Vue({
        el: "#app" ,
        data:{            
           n1:0,
           n2:0,
        },  
   })
</script>
2.5、条件渲染指令
条件渲染指令用来辅助开发者按需控制DOM 的显示与隐藏。条件渲染指令有如下两个,分别是:
v-if
v-show
v-if 和v-show 的区别
实现原理不同:
v-if 指令会动态地创建或移除DOM 元素,从而控制元素在页面上的显示与隐藏;
v-show 指令会动态为元素添加或移除 style="display: none;" 样式,从而控制元素的显示与隐藏。
性能消耗不同:
v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此:
如果需要非常频繁地切换,则使用 v-show 较好 。
如果在运行时条件很少改变,则使用 v-if 较好 。
v-if v-else-if v-else 组合
<p>
  <div v-if="type ==='A'">优秀</div>
  <div v-else-if="type ==='B'">良好</div>
  <div v-else-if="type ==='C'">一般</div>
  <div v-else>差</div>
</p>
2.6、循环渲染指令
vue 提供了v-for 循环渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构。v-for 指令需要使
用 item in items 形式的特殊语法,其中:
items 是待循环的数组。
item 是被循环的每一项。
只要有到 v-for 指令,一定要绑定一个 :key 属性,:key 属性的值必须是唯一的。
<div id="app">
  <p>
     id: <input type="text" name="id" id="id" v-model="id">
     name: <input type="text" name="idname" id="name" v-model="name">
     <button @click="add">添加对象</button>
  </p>
  <ul>
     <li v-for="(item,index) in list" :key="item.id"  > 
         索引是{{index}},姓名是{{item.name}}  
      </li>
  </ul>  
</div>
<script>
   const vm = new Vue({
        el: "#app" ,
        data:{
           id:"",
           name:"",
           list:[
              {id:1,name:"zhangsan"},
              {id:2,name:"lisi"},
              {id:3,name:"wangwu"},
           ]
        },
        methods:{
           add(){
              var item={"id":this.id,"name":this.name};
              console.log(item)
              this.list.push(item)
              this.id="";
              this.name="";
           }
        }
   })
</script>
key 的注意事项
① key 的值只能是 字符串 或 数字 类型
② key 的值必须具有 唯一性(即:key 的值不能重复)
③ 建议把 数据项id 属性的值 作为key 的值(因为id 属性的值具有 唯一性)
④ 使用 index 的值当作key 的值 没有任何意义(因为index 的值不具有唯一性)
⑤ 建议使用 v-for 指令时 一定要指定key 的值(既提升性能、又防止列表状态紊乱)
<ul>
   <li v-for="(item,index) in list"  :key="item.id" :title="'title-'+item.id" :index="'index-'+index" > 
   索引是{{index}},姓名是{{item.name}}  
   </li>
</ul>
3、Vue 过滤器 Filters
Filters : 只存在于 Vue2 ,Vue3 已没有过滤器。
3.1、Vue2的过滤器的定义
过滤器 (Filters)是vue 为开发者提供的功能,常用于文本的格式化。
过滤器可以用在两个地方:插值表达式 {{ }} 和 v-bind 属性绑定。
过滤器 应该被添加在 JavaScript 表达式的 尾部,由 管道符 进行调用,示例代码如下:
<!-- capitalize 就是一个名称为capitalize的过滤器 ,对message的值进行处理 -->
<p>{{ message | capitalize  }}</p>
<!-- formatId 就是一个名称为 formatId的过滤器 ,对rawId 的值进行处理 -->
<div  v-bind:id="rawId | formatId" ></div>
3.2、Vue2的定义过滤器
<div id="app">
  <div>{{message | capi}}</div>
</div>
   
<script src="./lib/vue-2.6.12.js"></script>
<script type="text/javascript">
  const vm =new Vue({
      "el":"#app",
      filters:{
      // 注意:过虑器函数形参中的val,永远都是“管道符”前面的那个值
          capi(val){
              // 强调,过滤器中,一定要有一个返回值
              const first=val.charAt(0).toUpperCase()
              const other = val.slice(1)
              return first+""+other;
         }
      }
   });
</script>
3.3、Vue2 全局过滤器
全局过滤器:在filters 节点下定义的过滤器,称为 私有过滤器, 因为它 只能在当前vm 实例所控制的 el 区域内使用。 如上一个示例。
全局过滤器:如果希望在多个vue 实例之间共享过滤器,则定义全局过滤器。格式如下
<div id="app">
   <div>{{message | capi2}}</div>
</div>
<script src="./lib/vue-2.6.12.js"></script>
<script type="text/javascript">
    // Vue.fiter() 接收两个参数:
   // 第1个参数,全局过滤器的 “名称”
   // 第2个参数,全避过滤器的 “处理函数”
   Vue.filter('capi2',(str)=>{
       const first=str.charAt(0).toUpperCase()
       const other = str.slice(1)
       return first+""+other;
   })
   const vm =new Vue({
       "el":"#app",
       data:{
           message:"hello vue.js",
       },
       filters:{
           // 注意:过虑器函数形参中的val,永远都是“管道符”前面的那个值
           capi(val){
               // 强调,过滤器中,一定要有一个返回值
               const first=val.charAt(0).toUpperCase()
               const other = val.slice(1)
               return first+""+other;
           }
       }
   })
</script>
3.4、带参数的过滤器
<div id="app">
   <div>{{message | filterA( arg1 ,arg2) }}</div>
</div>
<script src="./lib/vue-2.6.12.js"></script>
<script type="text/javascript">
    // fiter() 函数的形参 列表中
   // 第1个参数,永远都是“管道符”前面待处理的值
   // 第第2个参数开始,才是调用过滤器时传递过来的arg1,argument参数
   Vue.filter('capi2',(msg , arg1 , arg2)=>{
      ...省略...
   });   
</script>
4、watch 监听器
4.1、watch 监听器的定义
watch监听器公允开发者监听数据的变化,从而针对数据的变化做出特定的操作。
语法格式:
<div id="app">
     <input type="text"  v-model="username" >
</div>
<script type="text/javascript">
   const vm =new Vue({
       "el":"#app",
       data:{
           username:'',
       },
       watch:{
           // 监听 username 值的变化
           // newVal是变化后的新值,oldVal是变化之前的旧值
           username(newVal,oldVal){
               console.log(newVal +" , "+oldVal)
           }            
       }
   })
</script>
注意事项:
input中必须使用 v-model 。
页面加载完毕后,如果没有对 username 进行任何操作时,是不监听的。只有当对username 进行操作后,才开始监听。
4.2、监听器的格式
方法格式的监听器
格式:监听 username 时, 格式是 username(newVal,oldVal) 。
缺点1:无法在刚进入页面时,自动触发监听。
缺点2:如果监听的是一个对象,对象中属性值的变化不会触发监听器。
对象格式的监听器
格式::监听 username 时, 格式是 username:{ ... } 。
好处1:可以通过 immediate 选项,让 监听器 自动触发 监听(就是立即监听)。
好处2:可以通过 deep 选项,让 监听器 深度监听。
方法格式:
username(newVal,oldVal){
//...
}
对象格式:
username:{
handler(newVal,oldVal){
 //...
},
deep: true,
immediate: true,
}
下面是改成 对象格式 的相关示例。
4.3、立即监听(immediate 选项)
默认情况下,组件在初次加载完毕后,不会调 用 watch 监听器。
如果想让 watch 监听器立即被调用,则用 immediate 选项。
<div id="app">
     <input type="text"  v-model="username" >
</div>
<script type="text/javascript">
   const vm =new Vue({
       "el":"#app",
       data:{
           username:'',
       },
       watch:{      
        // 此处是对象格式的监听
           username:{
            // handler 是固定写法,表示当username的值变化时,自动调用 handler函数 
               handler: function(newVal ,oldVal) {
                    console.log(newVal +" , "+oldVal)
                       // ... 其它操作省略
               },
               // 表示页面渲染好之后,就立即触发当前的watch监听器
               immediate: true, 
           }
       }
   })
</script>
说明:
当页面加载完成后,立即监听 username 的值。
handler: function(newVal ,oldVal) 的简写是 handler (newVal ,oldVal) 。
4.4、监听对象的属性值的变化(deep选项)
如果watch 监听的是一个 对象,如果 对象中的属性值 发生了变化,则无法被监听到, 必须使用 deep 才能监听到。
<script type="text/javascript">
   const vm =new Vue({
       "el":"#app",
       data:{
           info:{username:'admin'}
       },
       watch:{
        // 对象格式的监听,监听对象的所有属性值的变化
           info:{
               // handler 是固定写法,
            handler(newVal){
             console.log(newVal)
            },
            deep: true 
           },            
       }
   })
</script>
监听对象时的必须配置:
使用对象监听器
配置 deep参数
4.5、监听对象单个属性值的变化
<script type="text/javascript">
   const vm =new Vue({
       "el":"#app",
       data:{
           info:{username:'admin'}
       },
       watch:{
        // 对象格式的监听,监听对象的单个属性值
           'info.username':{
               // handler 是固定写法,
            handler(newVal){
             console.log(newVal);
            },        
           },        
       }
   })
</script>
监听对象时的必须配置:
使用对象监听器
无须配置 deep参数
5、计算属性(computed)
5.1、计算属性的定义
计算属性指的是 通过一系列运算 之后,最终得到一个 属性值。
这个动态计算出来的属性值 可以被模板结构或methods 方法使用。
没有使用 计算属性 前的代码:
<div id="app">
  Red: <input type="text"  v-model="r" > <br>
  Green: <input type="text"  v-model="g" > <br>
  Blue: <input type="text"  v-model="b" > <br>
 
   <div class="box"  :style="{ backgroundColor:`rgb(${r},${g},${b})` }" >
       {{  `rgb( ${r},${g},${b}  )`  }}
   </div>
   <button @click="show">按钮</button>
</div>    
<script src="./lib/vue-2.6.12.js"></script>
<script type="text/javascript">
   const vm =new Vue({
       "el":"#app",
       data:{
           r:0,
           g:0,
           b:0,
       },       
       methods:{               
           // 点击按钮,在终端显示最新的颜色
           show(){
               console.log(`rgb(${this.r},${this.g},${this.b})`)
           }
       }
   })
</script>
使用 计算属性 的代码
<div id="app">
  Red: <input type="text"  v-model="r" > <br>
  Green: <input type="text"  v-model="g" > <br>
  Blue: <input type="text"  v-model="b" > <br>
 
   <div class="box"  :style="{ backgroundColor: rgb }" >
       {{  rgb  }}
   </div>
   <button @click="show">按钮</button>
</div>    
<script src="./lib/vue-2.6.12.js"></script>
<script type="text/javascript">
   const vm =new Vue({
       "el":"#app",
       data:{
           r:0,
           g:0,
           b:0,
       },
       // 所有的计算属性,都要定义到computed 节点下。
       //计算属性在定义的时候,要定义成 "方法格式"
       computed:{
           // rgb作为一个计算属性,被定义成方法格式
           // 最终,在这个方法中,要返回一个生成好的 rgb(x,x,x) 的字符串
           rgb(){
               return `rgb( ${this.r} ,${this.g} ,${this.b} )`
           }
       },
       methods:{               
           // 点击按钮,在终端显示最新的颜色
           show(){
               console.log( this.rgb )
           }
       }
   })
</script>
特点:
所有的计算属性,都要定义到 computed 节点下。
计算属性在定义的时候,要定义成 “方法格式” 。
好处:
实现了代码的复用。
只要计算属性中依赖的数据源变化了,则计算属性的值会自动重新求值。
 
全部评论