二、vue常用指令
1 <div id="app"> 2 <div>{{message}}</div> 3 <div v-cloak>{{message}}</div> 4 </div> 5 <script src="./js/vue.js"></script> 6 <script type='javascript'> 7 setTimeout(function(){ 8 const vm = new Vue({ 9 el: '#app', 10 data: { 11 message: '你好世界' 12 } 13 }) 14 },1000) 15 </script>
1 <style> 2 /*在样式中加入,让前1秒不显示内容*/ 3 [v-cloak] { 4 display: none; 5 } 6 </style> 7 8 <div v-cloak> 9 {{ message }} 10 </div
二、
1 <div id="app"> 2 <h3>{{message}}</h3> 3 <!-- 添加v-once后,修改data中的message,页面展示的内容将不会发生改变 --> 4 <div v-once>{{message}}</div> 5 </div> 6 <script src="./js/vue.js"></script> 7 <script type='javascript'> 8 const vm = new Vue({ 9 el: '#app', 10 data: { 11 message: '你好世界' 12 } 13 }) 14 </script>
三、v-html
作用:将内容按照html插入
例:将字符串作为链接在页面进行展示(如下)
1 <div id="app"> 2 <h1>{{url}}</h1> 3 <h1 v-html="url"></h1> 4 </div> 5 <script src="./js/vue.js"></script> 6 <script type='javascript'> 7 const vm = new Vue({ 8 el: '#app', 9 data: { 10 url: '<a href="http://www.baidu.com">百度一下</a>' 11 } 12 }) 13 </script>
四、v-text
作用:将内容按照文本插入,可以代替mustache语法
缺点:不够灵活,不如mustache(双大括号)语法后面可以跟其他内容
1 <div id="app"> 2 <h1>{{url}},可以拼接内容</h1> 3 <!-- 以纯文本进行展示,并且标签内的内容(如果有)不会展示 --> 4 <h1 v-text="url"></h1> 5 </div> 6 <script src="./js/vue.js"></script> 7 <script type='javascript'> 8 const vm = new Vue({ 9 el: '#app', 10 data: { 11 url: '<a href="http://www.baidu.com">百度一下</a>' 12 } 13 }) 14 </script>
五、v-pre
作用:跳过这个元素和它的子元素的编译过程,可用来显示原始的mustache标签
例:页面展示为{{ this will not be compiled }}
1 <span v-pre>{{ this will not be compiled }}</span>
六、v-bind
作用:动态的绑定一个或多个attribute,或一个prop
简写::(冒号)
应用场景:
1、比如动态的绑定a元素的href属性
2、比如动态的绑定img元素的src属性
1 <div id="app"> 2 <a v-bind:href="url"></a> 3 <!-- 简写 --> 4 <a :href="url"></a> 5 </div> 6 <script src="./js/vue.js"></script> 7 <script type='javascript'> 8 const vm = new Vue({ 9 el: '#app', 10 data: { 11 url: '<a href="http://www.baidu.com">百度一下</a>' 12 } 13 }) 14 </script>
3、比如动态的绑定class
1 <style> 2 .active{ 3 color: red; 4 } 5 </style> 6 <div id="app"> 7 <h1 v-bind:class="active">{{msg}}</h1> 8 <h1 v-bind:class="{active: isActive}">{{msg}}</h1> 9 </div> 10 <script src="./js/vue.js"></script> 11 <script type='javascript'> 12 const vm = new Vue({ 13 el: '#app', 14 data: { 15 msg: '你好', 16 active: active, 17 isActive: true 18 } 19 }) 20 </script>
七、v-on
作用:绑定事件监听器(事件绑定)
简写:@
1 <!-- 常规写法 --> 2 <button v-on:click="btnFun"></button> 3 <!-- 缩写 --> 4 <button @click="btnFun"></button>
事件处理函数传参
1 <!-- 事件处理函数调用:直接写函数名 --> 2 <button @click="say"></button> 3 4 <!-- 事件处理函数调用:常规调用 --> 5 <button @click="say('hi',$event)"></button>
在不传递自定义参数的时候,上述两种用法均可以使用;但是如果需要传递自定义参数的话,则需要使用第2种方式。
事件对象的传递与接收注意点:
1、如果事件直接使用函数名并且不屑小括号,那么默认会将事件对象作为唯一参数进行传递
2、如果使用了常规的自定义事件调用(只要写了小括号),需要使用事件对象必须作为最后一个参数进行传递,且事件对象的名称必须是“$event”
事件修饰符:处理事件的特定行为
1 <!-- 停止冒泡 --> 2 <button @click.stop="doThis"></button> 3 4 <!-- 阻止默认行为 --> 5 <button @click.prevent="doThis"></button> 6 7 <!-- 阻止默认行为,没有表达式 --> 8 <form @submit.prevent></form> 9 10 <!-- 串联修饰符 --> 11 <button @click.stop.prevent="doThis"></button>
1 <!-- 键修饰符,键别名 --> 2 <input @keyup.enter="onEnter"> 3 4 <!-- 键修饰符,键代码 --> 5 <input @keyup.13="onEnter"> 6 7 <!-- 点击回调只会触发一次 --> 8 <button v-on:click.once="doThis"></button>
八、
1 <!-- 模板部分 --> 2 <ul> 3 <!-- 直接取值 --> 4 <li v-for='item in fruits'>{{item}}</li> 5 <!-- 带索引下标 --> 6 <li v-for='(item,index) in fruits'>{{item}}{{index}}</li> 7 </ul> 8 9 <!-- JavaScript部分 --> 10 ...... 11 data: { 12 fruits: ['apple','pear','banana','orange'] 13 } 14 ......
遍历key的作用:提高性能,不影响显示效果(如果没有id,可以考虑采用索引)
1 <ul> 2 <li :key='item.id' v-for='(item,index) in fruits'>{{item}}</li> 3 </ul>
对象遍历
1 <!-- 模板部分 --> 2 <ul> 3 <li v-for='(value,key,index) in obj'>{{value + '-' + key + '-' + index}}</li> 4 </ul> 5 6 <!-- JavaScript部分 --> 7 ...... 8 data: { 9 obj: { 10 username: 'zhangsan', 11 age: 18, 12 gender: 'male' 13 } 14 } 15 ......
分支指令:根据表达式的布尔值(true/false)进行判断是否渲染该元素
1、v-if,v-if可以单独使用,也可以配合v-else、v-else-if一起使用
2、v-else
3、v-else-if
4、v-show,
1 <!-- 模板部分 --> 2 <div v-if="score >= 90"> 3 优秀 4 </div> 5 <div v-else-if="score >= 80 && score < 90"> 6 良好 7 </div> 8 <div v-else-if="score >= 70 && score < 80"> 9 一般 10 </div> 11 <div v-else> 12 不及格 13 </div> 14 <!-- v-show --> 15 <div v-show='flag'>测试v-show</div> 16 17 <!-- JavaScript部分 --> 18 ...... 19 data: { 20 score: 88, 21 flag:false 22 } 23 ......
v-if和v-show的区别:
1、v-if控制元素是否渲染
2、v-show控制元素是否显示(已经渲染,display:none,显示内容高频切换时使用)
九、v-model
作用:表单元素的绑定,在表单控件或者组件上创建双向绑定
v-model会忽略所有表单元素的value、checked、selected特性的初始值,而总是将Vue实例的数据作为数据来源,应该在data选项中声明初始值。
1、
.number:自动将用户的输入值转为数值类型(如果能转的话)
.trim:自动过滤用户输入的首尾空白字符
2、
1 <div id='app'> 2 <p>{{message}}</p> 3 <input type='text' v-model='message'> 4 5 <!-- v-model其实是`语法糖`,它是下面这种写法的简写,这种语法对语言的功能并没有影响,但是更方便程序员使用 --> 6 <input type='text' :value='msg' @input='msg=$event.target.value'/> 7 </div> 8 9 <script type='text/javascript'> 10 new Vue({ 11 el: '#app', 12 data: { 13 msg: 'message默认值' 14 } 15 }) 16 </script>
3、多行文本上使用
1 <div id='app'> 2 <textarea v-model="message"></textarea> 3 </div> 4 5 <script type='text/javascript'> 6 new Vue({ 7 el: '#app', 8 data: { 9 message: '我是多行文本内容' 10 } 11 }) 12 </script>
注意:在多行文本框中使用插值表达式无效(此时,其只能接受数据,不能改变数据)
4、单个复选框上使用
1 <div id='app'> 2 <input type="checkbox" v-model="checked"> 3 </div> 4 5 <script type='text/javascript'> 6 new Vue({ 7 el: '#app', 8 data:{ 9 checked:true 10 } 11 }) 12 </script>
5、多个复选框上使用
1 <div id='app'> 2 <input type="checkbox" value="html" v-model="checkedNames"> 3 <input type="checkbox" value="css" v-model="checkedNames"> 4 <input type="checkbox" value="js" v-model="checkedNames"> 5 </div> 6 7 <script type='text/javascript'> 8 new Vue({ 9 el: '#app', 10 data:{ 11 // 如果数组中有对应的value值,则此checkbox会被选中 12 checkedNames:[] 13 } 14 }) 15 </script>
注意:此种用法需要input
标签提供value
属性,并且需要注意属性的大小写要与数组元素的大小写一致
6、单选按钮上使用
1 <div id='app'> 2 男<input type="radio" name="sex" value="男" v-model="sex"> 3 <!-- 注:使用v-model后可以省略name属性 --> 4 <!-- 男<input type="radio" value="男" v-model="sex"> --> 5 女<input type="radio" name="sex" value="女" v-model="sex"> 6 </div> 7 8 <script type='text/javascript'> 9 new Vue({ 10 el: '#app', 11 data: { 12 sex: '女' 13 } 14 }) 15 </script>
7、下拉框上使用
1 <div id='app'> 2 <!-- select中multiple属性:进行多选 --> 3 <select v-model="selected"> 4 <option>请选择</option> 5 <option>HTML</option> 6 <option>CSS</option> 7 <option>JS</option> 8 </select> 9 </div> 10 11 <script type='text/javascript'> 12 new Vue({ 13 el: '#app', 14 data: { 15 selected: 'JS' 16 } 17 }) 18 </script>
8、
1 <div id='app'> 2 <input type="text" v-model="message"> 3 <input type="text" :value="message" @input="valueChange"> 4 <h2>{{message}}</h2> 5 </div> 6 7 <script type='text/javascript'> 8 new Vue({ 9 el: '#app', 10 data: { 11 message: '你好' 12 }, 13 methods:{ 14 valueChange(event){ 15 this.message = event.target.value 16 } 17 } 18 }) 19 </script>
十、自定义指令
1 // 无参(v-once/v-cloak) 2 Vue.directive('指令名',{ 3 钩子函数名: function(el[,....]){ 4 // 业务逻辑 5 // el参数是挂载到的元素的DOM对象 6 } 7 } 8 // 传参(v-text/v-html/v-model) 9 Vue.directive('指令名',{ 10 钩子函数名: function(el,binding[,....]){ 11 let param = binding.value 12 // 业务逻辑 13 }, 14 .... 15 } 16 17 // 注册一个全局自定义指令 `v-focus` 18 Vue.directive('focus', { 19 // 当被绑定的元素插入到 DOM 中时…… 20 inserted: function (el) { 21 // 聚焦元素 22 el.focus() 23 } 24 })
全局自定义指令不能写在Vue实例中(或者某个组件中)。
1 directives: { 2 指令名: { 3 // 指令的定义 4 钩子函数名: function (el,binding) { 5 // 业务逻辑 6 } 7 } 8 } 9 10 directives: { 11 focus: { 12 // 指令的定义 13 inserted: function (el) { 14 el.focus() 15 } 16 } 17 }
1 <input v-focus>
案例:
1、
2、
1 <div id="app"> 2 <!-- 全局自定义指令 --> 3 <div v-red>v-red指令的效果{{msg}}</div> 4 <div v-color="'green'">v-color指令的效果</div> 5 6 <!-- 自定义指令 --> 7 <input type="text" v-model='phone' v-mobile> 8 </div> 9 10 <script src="./js/vue.js"></script> 11 <script> 12 // 全局自定义指令 v-red 、 v-color 13 Vue.directive('red',{ 14 inserted: function(el){ 15 // 给元素加上红色 16 el.style.color = 'red' 17 } 18 }) 19 Vue.directive('color',{ 20 inserted: function(el,binding){ 21 el.style.color = binding.value 22 } 23 }) 24 25 new Vue({ 26 el: '#app', 27 data: { 28 msg: '123', 29 phone: '' 30 }, 31 // 局部自定义指令 32 directives: { 33 mobile: { 34 update: function(el){ 35 //console.log(el.value); 36 if(!(/^1[3-9]\d{9}$/.test(el.value))){ 37 el.style.color = 'red' 38 }else{ 39 el.style.color = 'black' 40 } 41 } 42 } 43 } 44 }) 45 </script>