目录
v-show:使用频率高的情况下使用,通过控制display的值来显示隐藏元素
v-if:使用频率低的情况下使用,通过操作dom节点的新增和删除来显示隐藏元素
v-if 、v-else-if、v-else 这三个必须连续使用,不允许被打断,
v-else建议最好不要写条件,这是没有意义的
标签不影响结构,能与v-if 搭配使用,不能和v-show搭配使用
1. 遍历数组(多)
- <h2>人员列表(遍历数组)h2>
- <ul>
- <li v-for="(p,index) of persons" :key="index">
- {{p.name}}-{{p.age}}
- li>
- ul>
2. 遍历数组
- <h2>汽车信息(遍历对象)h2>
- <ul>
- <li v-for="(value,k) of car" :key="k">
- {{k}}-{{value}}
- li>
- ul>
3. 遍历字符串(少)
- <h2>测试遍历字符串(用得少)h2>
- <ul>
- <li v-for="(char,index) of str" :key="index">
- {{char}}-{{index}}
- li>
- ul>
4. 遍历次数(少 )
- <h2>测试遍历指定次数(用得少)h2>
- <ul>
- <li v-for="(number,index) of 5" :key="index">
- {{index}}-{{number}}
- li>
- ul>
真实的dom是没有key的,虚拟dom有key,vue 会将初始的虚拟dom和新虚拟dom 使用 diff 对比算法进行比对,最后将虚拟dom转为真实dom
3.2.1 如果没有指定key,diff 算法会将下标作为key值,会引发如下问题:
3.2.2 虚拟DOM 中key的作用:(面试常问)
key 是DOM对象的标识,当数据发生变化时,vue 会根据新数据生成虚拟DOM,随后vue将新的虚拟DOM与旧虚拟DOM的差异使用diff算法进行比较,最后创建新的真实DOM
3.2.3 diff算法 对比规则:
3.2.4 开发中正确选择key
最好使用每条数据中唯一标识作为key,如学号,身份证号,手机号
如果不存在对数据的逆序添加、逆序删除等破坏顺序等操作,仅用于渲染列表展示,使用index 作为key 是没有问题的
filter()过滤函数
indexOf 如果为空,则包含里面所有的数据
indexOf 包含该元素返回元素索引值,不包含返回-1
列表过滤不要修改原数据,原数据修改了就回不去了
原理:创建一个新数组,存放过滤出来的数据
- html>
- <html>
- <head>
- <meta charset="UTF-8" />
- <title>列表过滤title>
- <script type="text/javascript" src="../js/vue.js">script>
- head>
- <body>
- <div id="root">
- <h2>人员列表h2>
- <input type="text" placeholder="请输入名字" v-model="keyWord">
- <ul>
- <li v-for="(p,index) of filPerons" :key="index">
- {{p.name}}-{{p.age}}-{{p.sex}}
- li>
- ul>
- div>
- <script type="text/javascript">
- Vue.config.productionTip = false
- //用watch实现
- new Vue({
- el:'#root',
- data:{
- keyWord:'',
- persons:[
- {id:'001',name:'马冬梅',age:19,sex:'女'},
- {id:'002',name:'周冬雨',age:20,sex:'女'},
- {id:'003',name:'周杰伦',age:21,sex:'男'},
- {id:'004',name:'温兆伦',age:22,sex:'男'}
- ],
- filPerons:[]
- },
- watch:{
- keyWord:{
- immediate:true,
- handler(val){
- this.filPerons = this.persons.filter((p)=>{
- return p.name.indexOf(val) !== -1
- })
- }
- }
- }
- })
- script>
- html>
原理:计算属性在一开始时和所依赖的数据发生变化时调用
- html>
- <html>
- <head>
- <meta charset="UTF-8" />
- <title>列表过滤title>
- <script type="text/javascript" src="../js/vue.js">script>
- head>
- <body>
-
- <div id="root">
- <h2>人员列表h2>
- <input type="text" placeholder="请输入名字" v-model="keyWord">
- <ul>
- <li v-for="(p,index) of filPerons" :key="index">
- {{p.name}}-{{p.age}}-{{p.sex}}
- li>
- ul>
- div>
-
- <script type="text/javascript">
- Vue.config.productionTip = false
- //用computed实现
- new Vue({
- el:'#root',
- data:{
- keyWord:'',
- persons:[
- {id:'001',name:'马冬梅',age:19,sex:'女'},
- {id:'002',name:'周冬雨',age:20,sex:'女'},
- {id:'003',name:'周杰伦',age:21,sex:'男'},
- {id:'004',name:'温兆伦',age:22,sex:'男'}
- ]
- },
- computed:{
- filPerons(){
- return this.persons.filter((p)=>{
- return p.name.indexOf(this.keyWord) !== -1
- })
- }
- }
- })
- script>
- html>
顺序、降序和原顺序
知识储备:
- <body>
-
- <div id="root">
- <h2>人员列表h2>
- <input type="text" placeholder="请输入名字" v-model="keyWord">
- <button @click="sortType = 2">年龄升序button>
- <button @click="sortType = 1">年龄降序button>
- <button @click="sortType = 0">原顺序button>
- <ul>
- <li v-for="(p,index) of filPerons" :key="p.id">
- {{p.name}}-{{p.age}}-{{p.sex}}
- <input type="text">
- li>
- ul>
- div>
-
- <script type="text/javascript">
- Vue.config.productionTip = false
-
- new Vue({
- el:'#root',
- data:{
- keyWord:'',
- sortType:0, //0原顺序 1降序 2升序
- persons:[
- {id:'001',name:'马冬梅',age:30,sex:'女'},
- {id:'002',name:'周冬雨',age:31,sex:'女'},
- {id:'003',name:'周杰伦',age:18,sex:'男'},
- {id:'004',name:'温兆伦',age:19,sex:'男'}
- ]
- },
- computed:{
- filPerons(){
- const arr = this.persons.filter((p)=>{
- return p.name.indexOf(this.keyWord) !== -1
- })
- //判断一下是否需要排序
- if(this.sortType){
- arr.sort((p1,p2)=>{
- return this.sortType === 1 ? p2.age-p1.age : p1.age-p2.age
- })
- }
- return arr
- }
- }
- })
-
- script>
- <div id="root">
- <h2>人员列表h2>
- <button @click="updateMei">更新马冬梅的信息button>
- <ul>
- <li v-for="(p,index) of persons" :key="p.id">
- {{p.name}}-{{p.age}}-{{p.sex}}
- li>
- ul>
- div>
-
- <script type="text/javascript">
- Vue.config.productionTip = false
-
- const vm = new Vue({
- el:'#root',
- data:{
- persons:[
- {id:'001',name:'马冬梅',age:30,sex:'女'},
- {id:'002',name:'周冬雨',age:31,sex:'女'},
- {id:'003',name:'周杰伦',age:18,sex:'男'},
- {id:'004',name:'温兆伦',age:19,sex:'男'}
- ]
- },
- methods: {
- updateMei(){
- // this.persons[0].name = '马老师' //奏效
- // this.persons[0].age = 50 //奏效
- // this.persons[0].sex = '男' //奏效
- // this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效
- this.persons.splice(0,1,{id:'001',name:'马老师',age:50,sex:'男'})
- }
- }
- })
vue 检测数据原理:
1. vue 监视data中所有层次的数据
2. 如何检测对象中的数据:
3. 如何检测数组中的数据:
通过包裹数组元素的方法实现,本质是做了两件事:
4. 在Vue 修改数组中的某个元素一定要用如下方法:
API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
Vue.set() 或者 vm.$set()
注意:Vue.set() 和 vm.$set() 不能给vm 或者vm的根数据对象(vm._data)添加属性
vue 监测对象数据改变:只要修改数据,多层嵌套的都可以, set 和get就会监测到,就会重新生成模板,生成虚拟dom.....
如果数据是undefined,页面上是不显示的且不会报错,
后添加的数据是没有响应式的
数组的子元素没有setter和getter ,需要通过修改数组本身去触发这个数组的setter和getter完成更新
不能对数组进行赋值操作,如hobby[0]