绑定左侧一级菜单的结构,绑到父级上 @click='handleChange',同时id也添加动态绑定 :data-id='item.cat_id'
<!-- 左侧一级分类 --> <div class="left" @click='handleChange'> <div :data-id='item.cat_id' :key='item.cat_id' v-for='item in cate' :class="['menu-item', {active: currentId === item.cat_id}]"> {{item.cat_name}} </div> </div>在methods里面定义方法
handleChange (e) { // 控制菜单的切换 // console.log(e.target.dataset.id) let id = e.target.dataset.id //根据事件对象e,得到id值 this.currentId = id },console.log(e.target.dataset.id)显示为
此时,可以实现一级菜单正常切换功能
如果data中的数据发生变化,那么计算属性会重新计算结果,计算属性会基于之前的计算结果进行缓存(如果计算属性依赖的data发生变化,那么计算属性就会重新计算)
所以,id值变化,二级菜单的id同步变化;通过计算属性,引起三级菜单id值变化
export default { data () { return { currentId: 1, cate: [] } }, //2.二级菜单的currentId值变化,引起三级菜单cat_id值变化,所以切换一级菜单,二三级菜单会同步变化 computed: { // console.log('------------------') // 如果data中的数据发生变化,那么计算属性会重新计算结果 // 计算属性会基于之前的计算结果进行缓存(如果计算属性依赖的data发生变化,那么计算属性就会重新计算) rightData: function () { // 从全部数据中获取当前一级分类对应的右侧数据 let data = this.cate.filter(item => { return item.cat_id === this.currentId }) // 数组中必须有数据,才能获取对应的子属性 let rlist = data.length > 0 && data[0].children return rlist } }, methods: { //1.此处一级菜单id值变化,引起data中的currentId值同步变化 handleChange (e) { // 控制菜单的切换 // console.log(e.target.dataset.id) let id = e.target.dataset.id this.currentId = id }, async loadData () { // 调用接口获取分类数据 let data = await request('categories') this.cate = data } }, created () { this.loadData() }, components: { SearchBar } }计算属性会基于之前的计算结果进行缓存,改为数据,计算属性里面内容会触发重新进行计算
上面计算属性中的console.log('------------------'),检验缓存,显示为
补充:
计算属性的缓存验证,打印结果显示为:
hello Tom,第二次打印时,并没有再次调用计算属性;仅仅呈现上次结果,起到缓存作用:基于已有的计算结果,进行缓存,只要依赖的数据不发生变化,显示所有的结果只计算一次,节省时间,起到性能优化作用
showInfo JERRY,如果是函数,使用一次,就调用一次
总结:
计算属性会基于之前的计算结果进行缓存(如果计算属性依赖的data发生变化,那么计算属性就会重新计算)
计算属性的缓存机制,使用场景,属于性能优化
同一个页面中,计算属性使用了多次,它会缓存之前的数据。
