六、vue中的遍历操作和过滤器
|字数总计:1.9k|阅读时长:9分钟|阅读量:|
Vue 语法-Vue 中的 v-for?
🎉v-for 的遍历数组基本语法?
当我们有一组数据需要进行渲染时,我们就可以使用 v-for 来完成。
v-for 的语法类似于 JavaScript 中的 for 循环。
如果在遍历的过程中不需要使用索引值
1
| <li v-for="item in items">{{item}}</li>
|
如果在遍历的过程中需要拿到元素在数组中的索引值
1 2
| <li v-for="(item, index) in items">{{index+1}}{{item}}</li> //其中的index就代表了取出的item在原数组的索引值。
|
🎉v-for 的遍历对象基本语法?
在遍历对象的时候,如果知识获取一个值只能获取一个值 value。
如果想显示 key 则需要加()。
1 2
| <li v-for="(item, key) in items">{{key}}-{{item}}</li> //其中的key就代表了取出的item在原数组的key值。
|
🎉 在使用 v-for 时给对应的组件添加:key 属性?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div id="app"> <ul> <li v-for="item in letters" key="item">{{item}}</li> </ul> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el:'#app', data:{ message:'你好!', letters:['A','B','C','D','E'] } }) </script> <!-- 在数组中插入一个值 --> app.letters.splice(2,0,"F")
|
没有 key 的 Diff 算法
有 key 的 Diff 算法
所以我们需要使用 key 来给每个节点做一个唯一标识
Diff 算法就可以正确的识别此节点
找到正确的位置区插入新的节点
🎉 哪些数组的方法是响应式的?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <ul> <li v-for="item in letters">{{item}}</li> </ul> <button @click="btnClick">增加</button> </div> <script src="../js/vue.js"></script> <script> const app = new Vue({ el:'#app', data:{ message:'你好!', letters:["a","b","c","d","e"] }, methods:{ btnClick(){ vue.set(this.letters,0,"bbbb") } } }) </script> </body> </html>
|
Vue 语法-Vue 实现购物车?
🎉 实现效果?
🎉 实现代码?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body> <div class="container"> <div id="app" class="row"> <table class="table table-striped table-bordered"> <tbody> <tr> <th></th> <th> 书籍名称 </th> <th> 出版日期 </th> <th> 价格 </th> <th> 购买数量 </th> <th> 操作 </th> </tr> <tr v-show="havenobook" ><td style="text-align: center" colspan="6">购物车为空!</td></tr> <tr v-for="(item,index) in books"> <td> {{index + 1}} </td> <td> <b>{{item.name}} </b></td> <td> {{item.date}} </td> <td> {{item.price}} </td> <td> <button class="btn btn-default btn-sm" @click="numdown(index)">-</button> <span >{{item.num}}</span> <button class="btn btn-default btn-sm" @click="numup(index)">+</button> </td> <td> <button class="btn btn-default btn-sm" @click="reducebook(index)">移除</button> </td> </tr> <tr style="text-align: center"> <td colspan="6">总价:¥{{Math.round(totalprice)/100}}</td> </tr> </tbody> </table> </div> </div>
<script> const app = new Vue({ el:'#app', data:{ message:'你好!', books:[ {name:"《算法导论》",date:"2006-9",price:"¥85.12",num:1}, {name:"《UNIX编程艺术》",date:"2006-2",price:"¥59.25",num:1}, {name:"《编程珠玑》",date:"2008-10",price:"¥39.34",num:1}, {name:"《代码大全》",date:"2006-3",price:"¥128.45",num:1} ], havenobook:false }, methods:{ numup(index){ this.books[index].num++ }, numdown(index){ if(this.books[index].num > 1){this.books[index].num--} }, reducebook(index){ this.books.splice(index,1); if(this.books.length === 0){ alert("购物车为空!"); this.havenobook = true } } }, computed:{ totalprice:function () { let result = 0 ; for(let i=0; i< this.books.length;i++){ let prices = this.books[i].price.split("¥") result += parseFloat(prices[1]) * 100 * this.books[i].num } return result } } }) </script> </body> </html>
|
Vue 语法-Vue 过滤器?
在官方文档中,是这样说明的:可被用于一些常见的文本格式化,vue 中过滤器的作用可被用于一些常见的文本格式化。(也就是修饰文本,但是文本内容不会改变)
补充:
过滤器分全局过滤器和局部过滤器,下边我着重说下全局过滤器,因为全局过滤器在项目中使用频率非常高!
🎉 局部过滤器:
过滤器可以用在两个地方:双花括号插值 或 v-bind 表达式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div id="app"> <p>电脑价格:{{price | addPriceIcon}}</p> </div>
<script> let vm = new Vue({ el:"#app", data:{ price:200 }, filters:{ addPriceIcon(value){ console.log(value) return '¥' + value } } }) </script>
|
上边代码,我的需求是想把价格前面加上人民币符号(¥),模板中文本后边需要添加管道符号( | )作为分隔,管道符 | 后边是文本的处理函数,处理函数的第一个参数是:管道符前边的——文本内容,如果处理函数上边传递参数,则从第二个参数依次往后是传递的参数。可能有人会问:你手动加上去不就得了!如果页面有上千个价格需要添加,怎么办?几十个页面需要添加怎么办呢,手动加能累晕!所以这种通用机制很重要。
🎉 全局过滤器使用:
Vue.filter( filterName,( )=>{ return // 数据处理结果 } )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <div id="app"> <h3>{{viewContent | addNamePrefix}}</h3> </div> <script> Vue.filter("addNamePrefix",(value)=>{ return "my name is" + value })
let vm = new Vue({ el:"#app", data:{ viewContent:"吕星辰" } }) </script>
|