6.循环遍历(v-for)
6.1.遍历数组
语法:
v-for="item in items" v-for="(item,index) in items"
items:要迭代的数组
item:存储数组元素的变量名
index:迭代到的当前元素索引,从0开始。
代码:
<div id="app"> <ul> <li v-for="(user, index) in users"> {{index}}--{{user.name}}--{{user.age}}--{{user.gender}} </li> </ul> </div> <script> var app = new Vue({ el:"#app",//el即element,要渲染的页面元素 data: { users:[ {"name":"白卓冉","age":8,"gender":"男"}, {"name":"白大锅","age":12,"gender":"女"}, {"name":"白仙女","age":4,"gender":"男"} ] } }); </script>
6.2.遍历对象
语法:
v-for="value in object" v-for="(value,key) in object" v-for="(value,key,index) in object"
value,对象的值
key, 对象的键
index, 索引,从0开始
代码:
<div id="app"> <ul> <li v-for="(value,key,index) in person"> {{index}}--{{key}}--{{value}} </li> </ul> </div> <script> var app = new Vue({ el:"#app",//el即element,要渲染的页面元素 data: { person:{"name":"白大锅", "age":3, "address":"中国"} } }); </script>
6.3.key
概述:
:key 一般配合v-for一起使用. 用来在特定情况下, 保证被遍历的数组中的元素的顺序.
案例:
<div id="app"> <button @click="add">添加</button> <ul> <li v-for="name in list"> <input type="checkbox"> {{name}} </li> </ul> </div> <script> var app = new Vue({ el: '#app', data: { list: ["孙悟空", "猪八戒", "沙和尚"] }, methods: { add() { //注意这里是unshift,向数组的头部添加一个元素 this.list.unshift("唐僧"); } } }); </script>
效果:
解决方案:
<div id="app"> <button @click="add">添加</button> <ul> <!-- 添加:key即可. 注意,key中的值必须是唯一且不会改变的值--> <li v-for="name in list" :key="name"> <input type="checkbox"> {{name}} </li> </ul> </div>
7.判断语法(v-if和v-show)
概述:
v-if与v-show可以根据条件的结果,来决定是否显示指定内容.
v-if: 条件不满足时, 元素不会存在.
v-show: 条件不满足时, 元素不会显示(但仍然存在).
案例:
<div id="app"> <button @click="show = !show">点我</button> <h1 v-if="show">Hello v-if.</h1> <h1 v-show="show">Hello v-show.</h1> </div> <script> var app = new Vue({ el:"#app", data: { show:true } }); </script>
8.显示数据(v-bind)
概述:
v-bind的作用和插值表达式差不多, 只不过, v-bind主要用于动态设置标签的属性值
语法:
<!--完整写法--> <标签名 v-bind:标签属性名="vue实例中的数据属性名"/> <!--简化写法--> <标签名 :标签属性名="vue实例中的数据属性名"/>
案例:
<div id="app"> <input type="button" :value="msg"/> </div> <script type="text/javascript"> var app = new Vue({ el:"#app", data:{ msg:"我是按钮" } }); </script>
9.Vue页面跳转(两种方法)
9.1.方法一(标签实现)
<router-link :to="{name: 'bookshelf', params: { entityId: this.entityId } }" :class="{'flex-item-1':'flex-item-1',cur:tabs[0].isShow}" href="javascript:"> <span class="tabNav-ico tabNav-book"></span> <span class="tabNav-txt">书 架</span> </router-link>
9.1.方法二(this.$router.push()实现)
当this.$router.push()只有一个参数时 默认为跳转地址 最多可传两个参数 第二个参数为地址参数
<a @click="toIndex" :class="{'flex-item-1':'flex-item-1',cur:tabs[2].isShow}" href="javascript:"> <span class="tabNav-ico tabNav-home"></span> <span class="tabNav-txt">首 页</span> </a> toIndex: function(){ this.$router.push("/?entityId="+ localStorage.getItem("entityId")); }
三、Vue其他语法
3.1.计算属性
概述:计算属性就是一个提前定义好的方法, 该方法可以看作是一个特殊的值, 可以在插值表达式中使用.
语法:
var app = new Vue({ el:"#app", //计算属性必须放在Vue的computed中 computed:{ //定义计算属性 属性名(){ return "返回值"; } } });
案例:
<div id="app"> <h1>{{birth}}</h1> <h1 v-text="birth"></h1> <h1 v-html="birth"></h1> </div> <script type="text/javascript"> var app = new Vue({ el:"#app", computed:{ //定义一个birth方法,该方法就是一个计算属性,可以在插值表达式中使用 birth(){ let date = new Date(); let year = date.getFullYear(); let month = date.getMonth()+1; let day = date.getDay(); return year + "-" + month + "-" + day; } } }); </script>
3.2.watch监控
概述:
watch可以监听简单属性值及其对象中属性值的变化.
watch类似于onchange事件,可以在属性值修改的时候,执行某些操作.
语法:
var app = new Vue({ el:"#app", data:{ message:"白大锅", person:{"name":"heima", "age":13} }, //watch监听 watch:{ //监听message属性值,newValue代表新值,oldValue代表旧值 message(newValue, oldValue){ console.log("新值:" + newValue + ";旧值:" + oldValue); }, //监控person对象的值,对象的监控只能获取新值 person: { //开启深度监控;监控对象中的属性值变化 deep: true, //获取到对象的最新属性数据(obj代表新对象) handler(obj){ console.log("name = " + obj.name + "; age=" + obj.age); } } } });
四、Vue组件
4.1.基本使用
概述:
组件, 类似于模版, 模块. 在项目需要重用某个模块(头部、尾部、新闻。。。)的时候,可以将模块抽取成组件,其它页面中注册组件并引用。
案例:
<div id="app"> <!--使用组件(组件名称),如果组件名称中有大写字母,如"myList",则这里需要书写<my-list>--> <counter></counter> <counter></counter> </div> <script type="text/javascript"> //定义组件 const counterTemp = { //定义组件的模版 template:`<button @click='num++'>你点击了{{num}}次</button>`, //定义组件中使用到的数据属性 data(){ return { num:0 } } }; //全局注册组件:在所有的vue实例中都可以使用组件 //参数1:组件名称,参数2:具体的组件 //Vue.component("counter", counterTemp); var app = new Vue({ el:"#app", //局部注册组件: 只能在当前Vue实例中使用 components:{ //组件名称:具体组件 counter: counterTemp } }); </script>
注意:
- 组件的模版中, 只能书写一个跟标签
- 组件的定义必须放在Vue创建对象之前, 否则报错
4.2.父组件向子组件通信
概述:
子组件无法直接使用父组件中的数据, 如果需要使用, 则必须由父组件把数据传递给子组件才可以.
本质: 让子组件中的属性与父组件中的属性进行关联绑定, 然后子组件使用该属性, 这样才能做到数据传递
意义:
可以把父组件中的数据, 更新传递到子组件
示例:
<div id="app"> <!-- 把父组件中的count传递给子组件的number属性,把父arr传递给子ids,把父p传递给子person --> <aaa :number="count" :ids="arr" :person="p"></aaa> </div> <script> var aaa = { //定义组件的模版 template: `<h2>{{num}}---{{number}}--{{ids}}--{{person}}</h2>`, //定义组件中使用到的数据属性 data() { return { num: 0 } }, //给组件添加属性 props: { //普通属性number number: "", //数组属性ids ids: [], //对象属性person person: {} /* * //以上属性还可以书写为以下格式 * items:{ * //数据类型,如果是数组则是Array,如果是对象则是Object * type:Array, * //默认值 * default:[] * } */ } }; //注册:全局注册 Vue.component("aaa", aaa); var app = new Vue({ el: "#app", data: { count: 5, arr: [1, 2, 3], p: {username: "zhangsan", age: 23} } }); </script>
4.3.子组件向父组件通信
概述:
子组件无法直接给父组件传递数据. 也无法操作父组件中的数据, 更无法调用父组件中的方法.
所以, 所谓的子组件向父组件通讯, 其实就是想办法让子组件调用父组件的方法. 进而响应到父组件中的数据.
意义:
子组件可以调用父组件中的方法
示例:
<div id="app"> <h1>父组件中:app_num={{app_num}}</h1> <!-- 把父组件的add方法,绑定给子组件的aaa属性,绑定方法使用@属性名="方法名" --> <!-- 把父组件的rem方法,绑定给子组件的bbb属性,绑定方法使用@属性名="方法名 --> <!-- 把父组件的app_num变量,绑定给子组件的counter_num属性,绑定变量使用:属性名="方法名 --> <counter @aaa="add" @bbb="rem" :counter_num="app_num"></counter> </div> <script> //定义一个组件(模版) let counter = { template: ` <div> <h1>子组件中:counter_num={{counter_num}}</h1> <input type="button" @click="fun1" value="+"/> <input type="button" @click="fun2" value="-"/> </div> `, props:{ //定义属性counter_num,用来接收父组件传递的数据 counter_num:null, //定义aaa属性,用来绑定父组件的方法,当然,该定义也可以省略 aaa:function(){}, //定义bbb属性,用来绑定父组件的方法,当然,该定义也可以省略 bbb:function(){}, }, methods:{ fun1(){ //找到aaa属性所绑定的那个方法,执行那个方法 return this.$emit("aaa"); }, fun2(){ //找到bbb属性所绑定的那个方法,执行那个方法 return this.$emit("bbb"); } } } var app = new Vue({ el: '#app', data: { app_num: 0 }, components: { counter }, methods:{ add(){ this.app_num++; }, rem(){ this.app_num--; } } }); </script>