课程名称:Vue Element+Node.js开发企业通用管理后台系统(第17章)
课程章节: 第17章 Vue进阶(下)
主讲老师:Sam
课程内容:
今天学习的内容包括:
课程收获:
provide 和 inject 是一起使用的。以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。在进行组件通信的时候,如果层级很深的情况就可以使用 provide 和 inject 。
<html> <head> <title>组件通信 provide 和 inject</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="root"> <Test></Test> </div> <script> function registerPlugin() { Vue.component('Test', { template: '<div>{{message}}<Test2 /></div>', provide() { return { elTest: this } }, // function 的用途是为了获取运行时环境,否则 this 将指向 window data() { return { message: 'message from Test' } }, methods: { change(component) { this.message = 'message from ' + component } } }) Vue.component('Test2', { template: '<Test3 />' }) Vue.component('Test3', { template: '<button @click="changeMessage">change</button>', inject: ['elTest'], methods: { changeMessage() { this.elTest.change(this.$options._componentTag) } } }) } Vue.use(registerPlugin) new Vue({ el: '#root' }) </script> </body> </html>
2.过滤器 filter
过滤器是对即将显示的数据做进一步的筛选处理,vue2 中提供一些过滤器,也可以使用 Vue.filter 定义全局过滤器,vue3 中废除了过滤器。
<html> <head> <title>过滤器 filter</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="root"> {{message | lower}} </div> <script> new Vue({ el: '#root', filters: { lower(value) { return value.toLowerCase() } }, data() { return { message: 'Hello Vue' } } }) </script> </body> </html>
watch 可以监听某个数据是否发了改变,如果该数据发生了改变 就会执行相应的操作。在使用的时候容易混淆的还有计算属性 computed,二者的区别在于,watch 是属性监听,监听属性的变化,而 computed 是计算属性,是通过属性计算而得到的属性。
<html> <head> <title>监听器 watch</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="root"> <h3>Watch 用法1:常见用法</h3> <input v-model="message"> <span>{{copyMessage}}</span> </div> <div id="root2"> <h3>Watch 用法2:绑定方法</h3> <input v-model="message"> <span>{{copyMessage}}</span> </div> <div id="root3"> <h3>Watch 用法3:deep + handler</h3> <input v-model="deepMessage.a.b"> <span>{{copyMessage}}</span> </div> <div id="root4"> <h3>Watch 用法4:immediate</h3> <input v-model="message"> <span>{{copyMessage}}</span> </div> <div id="root5"> <h3>Watch 用法5:绑定多个 handler</h3> <input v-model="message"> <span>{{copyMessage}}</span> </div> <div id="root6"> <h3>Watch 用法6:监听对象属性</h3> <input v-model="deepMessage.a.b"> <span>{{copyMessage}}</span> </div> <script> new Vue({ el: '#root', watch: { message(value) { this.copyMessage = value } }, data() { return { message: 'Hello Vue', copyMessage: '' } } }) new Vue({ el: '#root2', watch: { message: 'handleMessage' }, data() { return { message: 'Hello Vue', copyMessage: '' } }, methods: { handleMessage(value) { this.copyMessage = value } } }) new Vue({ el: '#root3', watch: { deepMessage: { handler: 'handleDeepMessage', deep: true } }, data() { return { deepMessage: { a: { b: 'Deep Message' } }, copyMessage: '' } }, methods: { handleDeepMessage(value) { this.copyMessage = value.a.b } } }) new Vue({ el: '#root4', watch: { message: { handler: 'handleMessage', immediate: true, } }, data() { return { message: 'Hello Vue', copyMessage: '' } }, methods: { handleMessage(value) { this.copyMessage = value } } }), new Vue({ el: '#root5', watch: { message: [{ handler: 'handleMessage', }, 'handleMessage2', function(value) { this.copyMessage = this.copyMessage + '...' }] }, data() { return { message: 'Hello Vue', copyMessage: '' } }, methods: { handleMessage(value) { this.copyMessage = value }, handleMessage2(value) { this.copyMessage = this.copyMessage + '*' } } }) new Vue({ el: '#root6', watch: { 'deepMessage.a.b': 'handleMessage' }, data() { return { deepMessage: { a: { b: 'Hello Vue' } }, copyMessage: '' } }, methods: { handleMessage(value) { this.copyMessage = value } } }) </script> </body> </html>
最后,附上课程截图 ending~