Vue指令
Vue的指令
指令(Directives) 是带有v- 前缀的特殊属性,指令属性是单一的js表达式.
指令的职责就是表达式的值发生变化时,在DOM中做出相应的回应.
1、v-text和v-html
v-text:插入一段文本
//插入一段文本 <div id="app"> <p v-text="message"></p> </div> <script> var vm = new Vue({ el:'#app', //表示在当前这个元素内开始使用VUE data:{ message:'hello world !' } }) </script>
v-html:既可以插入一段文本也可以插入html标签
//既可以插入一段文本也可以插入html标签 <div id="app"> <p v-html="message"></p> </div> <script> var vm = new Vue({ el:'#app', data:{ message:"<input type='button'>" } }) </script>
2、v-bind:绑定元素的属性来执行相应的操作
v-bind 指令可以更新 HTML 属性:
|
<a v-bind:href="url">...</a>
|
在这里 href 是参数,告知 v-bind 指令将该元素的 href 属性与表达式 url 的值绑定。
缩写==>可以用:代替v-bind
| <a :href="url">...</a> |
<!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"> <title>Title</title> <script src="vue.js"></script> <style> .bk_1{ width: 200px; height: 200px; background-color: silver; } .bk2_2{ width: 200px; height: 200px; background-color: darkorange; } .bk_3{ border: 5px solid #000; } </style> </head> <body> <div id="app"> <a href="http://www.baidu.com" v-bind:title="msg">腾讯</a> <!--绑定标题--> <a href="http://www.baidu.com" title="啦啦啦">点我</a> <!--绑定标题--> <div v-bind:class="bk"></div> <div v-bind:class="bk2"></div> <div :class="{bk_1:temp,bk_3:temp}">加油,吧</div> <!-- #temp一定是一个布尔值,为true是就使用那个类,false则不使用那个类--> <div :class="[bk2,bk3]"></div> <!--如果是多个类就用[bk1,bk2,],就显示两个类的样式--> </div> <script> var vm = new Vue({ el:"#app",//表示在当前这个元素开始使用VUe data:{ msg:"我想去腾讯上班", bk:"bk_1", bk2:"bk2_2", bk3:"bk_3", // temp: false, temp: true } }) </script> </body> </html>
3、 v-for:根据变量的值来循环渲染元素
数组的v-for
我们用 v-for 指令根据一组数组的选项列表进行渲染。v-for 指令需要使用item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名。
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li> </ul> </div> </body> <script> var example1 = new Vue({ el: '#example-1', data: { items: [ {message: 'Foo'}, {message: 'Bar'} ] } }) </script> </html>
结果:

在 v-for 块中,我们拥有对父作用域属性的完全访问权限。v-for 还支持一个可选的第二个参数为当前项的索引。
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <ul id="example-2"> <li v-for="(item, index) in items"> {{ parentMessage }} - {{ index }} - {{ item.message }} </li> </ul> </body> <script> var example2 = new Vue({ el: '#example-2', data: { parentMessage: 'Parent', items: [ {message: 'Foo'}, {message: 'Bar'} ] } }) </script> </html>
结果:

你也可以用 of 替代 in 作为分隔符,因为它是最接近 JavaScript 迭代器的语法:
| <div v-for="item of items"></div> |
对象的 v-for
你也可以用 v-for 通过一个对象的属性来迭代。
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <ul id="v-for-object" class="demo"> <li v-for="value in object"> {{ value }} </li> </ul> </body> <script> new Vue({ el: '#v-for-object', data: { object: { firstName: 'John', lastName: 'Doe', age: 30 } } }) </script> </html>
结果:

你也可以提供第二个的参数为键名:
<ul id="v-for-object" class="demo"> <div v-for="(value, key) in object"> {{ key }}: {{ value }} </div> </ul>
结果:

第三个参数为索引:
<ul id="v-for-object" class="demo"> <div v-for="(value, key, index) in object"> {{ index }}. {{ key }}: {{ value }} </div> </ul>
结果:

4、v-on:监听元素事件,并执行相应的操作
事件:click\keydown
<button v-on:click="greet"></button>
可以用@代替v-on
简写为
<button @click="greet"></button>
v-on 可以接收一个定义的方法来调用。
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="example-2"> <!-- `greet` 是在下面定义的方法名 --> <button v-on:click="greet">Greet</button> </div> </body> <script> var example2 = new Vue({ el: '#example-2', data: { name: 'Vue.js' }, // 在 `methods` 对象中定义方法 methods: { greet: function (event) { // `this` 在方法里指当前 Vue 实例 alert('Hello ' + this.name + '!') // `event` 是原生 DOM 事件 if (event) { alert(event.target.tagName) } } } }) // 也可以用 JavaScript 直接调用方法 example2.greet() // => 'Hello Vue.js!' </script> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="vue.js"></script> <style> ul li { list-style: none; } </style> </head> <body> <div id="app"> <ul> <li> <input type="checkbox">苹果 </li> <li> <input type="checkbox">香蕉 </li> <li> <input type="checkbox">香梨 </li> <li> <input type="checkbox" v-on:click="create()">其它 </li> <li v-html="htmlstr" v-show="test"> </li> </ul> </div> <script> var vm = new Vue({ el: "#app", //表示在当前这个元素内开始使用VUE data: { htmlstr: "<textarea></textarea>", test: false }, methods: { create: function () { this.test = !this.test; } } }) </script> </body> </html>
5、v-if:根据表达式的真假值来动态插入和移除元素
条件判断(v-if\v-else)
v-if 指令将根据表达式的真假值(true 或 false )来决定是否插入 元素。
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <ul v-if="ok"> <li> 哈哈哈 </li> </ul> <ul v-else> <li> 呵呵呵 </li> </ul> </div> </body> <script> var s=new Vue({ el: '#app', data: { ok: true } }) </script>

改变布尔值后,

实现tag切换
<!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"> <title>Title</title> <script src="vue.js"></script> <style> ul li{ list-style: none; display: inline-block; border: 1px solid cornflowerblue; height: 50px; width: 200px; background: cornflowerblue; text-align: center; line-height: 50px; } </style> </head> <body> <div id="mybox"> <ul> <li><span v-on:click="qh(true)">二维码登录</span></li> <li><span v-on:click="qh(false)">邮箱登录</span></li> </ul> <div v-if="temp"> <img src="erweima.png" alt=""> </div> <div v-if="!temp"> <!--取反--> <form action="http://mail.163.com" method="post"> <!--method是为了安全 ,action:提交的地址--> <p>邮箱:<input type="email"></p> <p>密码:<input type="password"></p> <p><input type="submit" value="登录"></p> </form> </div> </div> <script> new Vue({ el:"#mybox", //表示当前这个元素开始使用vue data:{ temp:true }, methods:{ qh:function (t) { this.temp=t } } }) </script> </body> </html>
6、v-show:根据表达式的真假值来隐藏和显示元素
根据表达式的真假值来渲染元素
用法和v-if大致一样:
| <h1 v-show="ok">Hello!</h1> |
不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS 属性 display。
根据时间切换2段文本内容
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <ul> <li v-show="ok"> 一闪一闪 </li> <li v-show="!ok">亮晶晶</li> </ul> </div> </body> <script> var vm = new Vue({ el: '#app', data: { ok: true } }) setInterval(function () { vm.ok = !vm.ok; },1000) </script>
7、实现了数据和视图的双向绑定
可以用 v-model 指令在表单控件元素上创建双向数据绑定。

v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值。
因为它会选择 Vue 实例数据来作为具体的值。
你应该通过 JavaScript 在组件的data 选项中声明初始值。
输入框
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <p>input 元素:</p> <input v-model="message" placeholder="编辑我……"> <p>消息是: {{ message }}</p> <p>textarea 元素:</p> <p style="white-space: pre">{{ message2 }}</p> <textarea v-model="message2" placeholder="多行文本输入……"></textarea> </div> <script> new Vue({ el: '#app', data: { message: 'Runoob', message2: '菜鸟教程\r\nhttp://www.runoob.com' } }) </script> </body> </html>
复选框
复选框如果是一个则为逻辑值,如果是多个则绑定到同一个数组:
以下实例中演示了复选框的双向数据绑定:
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <p>单个复选框:</p> <input type="checkbox" id="checkbox" v-model="checked"> <label for="checkbox">{{ checked }}</label> <p>多个复选框:</p> <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames"> <label for="runoob">Runoob</label> <input type="checkbox" id="google" value="Google" v-model="checkedNames"> <label for="google">Google</label> <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames"> <label for="taobao">taobao</label> <br> <span>选择的值为: {{ checkedNames }}</span> </div> <script> new Vue({ el: '#app', data: { checked : false, checkedNames: [] } }) </script> </body> </html>
实例中勾选复选框效果如下所示:

单选按钮
以下实例中演示了单选按钮的双向数据绑定:
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <input type="radio" id="runoob" value="Runoob" v-model="picked"> <label for="runoob">Runoob</label> <br> <input type="radio" id="google" value="Google" v-model="picked"> <label for="google">Google</label> <br> <span>选中值为: {{ picked }}</span> </div> <script> new Vue({ el: '#app', data: { picked : 'Runoob' } }) </script> </body> </html>
选中后,效果如下图所示:

select 列表
以下实例中演示了下拉列表的双向数据绑定:
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <select v-model="selected" name="fruit"> <option value="">选择一个网站</option> <option value="www.runoob.com">Runoob</option> <option value="www.google.com">Google</option> </select> <div id="output"> 选择的网站是: {{selected}} </div> </div> <script> new Vue({ el: '#app', data: { selected: '' } }) </script> </body> </html>
选取 Runoob,输出效果如下所示:

8、自定义指令
<!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"> <title>Title</title> <script src="vue.js"></script> </head> <body> <div id="app"> <input type="text" v-focus> </div> <script> new Vue({ el:"#app", data:{ }, directives:{ //directives定义指令的 focus:{ //focus指令的名字 inserted:function (els) { //els绑定的这个元素 //inserted当绑定的这个元素 <input type="text" v-focus>显示的时候, els.focus(); //获取焦点的一个方法,和以前的时候是一样的 els.style.backgroundColor="blue"; els.style.color='#fff' } } } }) </script> </body> </html>
小练习——维护用户信息
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="vue.js"></script> <style> ul li{ list-style: none; } </style> </head> <body> <div id="app"> <div> <input type="text" placeholder="姓名" v-model="username"> <input type="text" placeholder="年龄" v-model="age"> <input type="button" value="增加" @click="add"> </div> <div> <table cellpadding="0" border="1"> <tr v-for="(item,index) in arr"> <td><input type="text" class="txt" v-model="item.username"> </td> <td>{{item.age}}</td> <td>{{index}}</td> <td><input type="text" class="txt"></td> <td><input type="button" value="删除" @click="del(index)"></td> </tr> </table> </div> </div> <script> new Vue({ el: "#app", //表示在当前这个元素内开始使用VUE data:{ username: "", age: "", arr: [] }, methods: { add: function () { this.arr.push({username:this.username,age: this.age}); console.log(this.arr); }, del: function (index) { this.arr.splice(index,1); //删除数组中指定索引位置的元素,第二个参数是指定删除项目的数量 } } }) </script> </body> </html>
数组操作
- push #从末尾添加 - pop #从末尾删除 - shift #从头添加 - unshift #从头删除 - splice #删除元素。splice(index,howmany,item1,.....,itemX),从index位置开始删除howmany个元素,如果有item则用item替换被删除的元素
- reverse #反转

浙公网安备 33010602011771号