vue组件间通讯方法3-全局总线方式(推荐)
代码地址:
https://github.com/hurong241/vue_study/tree/master/vue2-cli/src/components/86
本例中实现与vue组件间通讯方法1-props实现列表综合实例/附id库安装方法 (hu-rong.com)中相同的功能,但代码改动不多
在main.js中定义全局事件总线
//引入Vue import Vue from 'vue' //引入组件 import App from './App86.vue' //引入插件 import plugins from './plugins' //关闭生产提示 Vue.config.productionTip = false //应用插件 Vue.use(plugins) //创建vm new Vue({ render: h => h(App), //全局事件总线 beforeCreate() { Vue.prototype.$bus = this } }).$mount('#app')
TableContainer.vue
template处不再用类似这种方式传递方法给子组件(<TableList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></TableList>)
在mounted()中给全局事件总线绑定事件,并在beforDestroy中销毁事件
<template> <div class="container"> <!--传method及数据给组件--> <TableTop></TableTop> <TableList :todos="todos"></TableList> <TableFoot :todos="todos"></TableFoot> </div> </template> <script> import TableTop from "@/components/86/TableTop"; import TableList from "@/components/86/TableList"; import TableFoot from "@/components/86/TableFoot"; export default { name: 'table-container', components: { TableTop, TableList, TableFoot }, data() { return { todos: JSON.parse(localStorage.getItem('todos')) || []//从存储中取数据,无则返回空数组 }; }, methods: { //接收来自top组件的数据 addTodo(value) { console.log('收到TableTop回传的数据', value) this.todos.unshift(value) }, //勾选或取消勾选 checkTodo(id) { console.log(id) this.todos.forEach((todo) => { if (todo.id === id) todo.done = !todo.done }) }, //删除 deleteTodo(id) { this.todos = this.todos.filter((todo) => { if (todo.id !== id) return todo }); }, //全选或全不选 checkAll(e) { this.todos.forEach((todo) => { todo.done = e.target.checked }) }, //清除所有已选 clearAllChecked() { console.log('删除所有勾选') this.todos = this.todos.filter((todo) => { return !todo.done }) } }, watch: { //在这里统一深度监视todos变化,只要变化就重新存储 'todos': { deep: true,//一条数据中的某个字段值变化也监视 handler(oldValue, newValue) { console.log('todo中数据变化', oldValue, newValue) localStorage.setItem('todos', JSON.stringify(oldValue)) }, } }, mounted() { //全局事件总线实现 this.$bus.$on('addTodo', this.addTodo) this.$bus.$on('checkTodo', this.checkTodo) this.$bus.$on('deleteTodo', this.deleteTodo) this.$bus.$on('checkAll', this.checkAll) this.$bus.$on('clearAllChecked', this.clearAllChecked) }, beforeDestroy() { //解绑全局事件 this.$bus.off(['addTodo', 'checkTodo', 'deleteTodo', 'checkAll', 'clearAllChecked']) } } </script> <style scoped> .container { border: 1px solid #aaa; padding: 10px; } </style>
TableTop.vue
不需要再在props中接收,触发及传参方式:this.$bus.$emit('addTodo', todoObj)
<template> <div> <label> <input placeholder="请输入" type="text" v-model="title" @keyup.enter="add"> </label> </div> </template> <script> import {nanoid} from 'nanoid' export default { name: 'table-top', data() { return { title: '', } }, methods: { add() { //const title = e.target.value.trim()//不建议这样,尽量用vm操作 const title = this.title.trim() if (!title) return alert('请输入')//空输入过滤 //生成id库安装方法:npm i nanoid const todoObj = {id: nanoid(), title: title, done: false} console.log('由TableTop生成的todoObj:', todoObj) //通过TableContainer传过来的接收函数,将todos回传给TableContainer this.$bus.$emit('addTodo', todoObj) //清空输入框 //e.target.value=''//不建议这样操作,尽量用vm操作 this.title = '' } }, //接收从TableContainer传过来方法 props: [] } </script> <style scoped> input { padding: 5px; border-radius: 5px; } </style>
赞:(0)
踩:(0)
- 相关文章
- 初识vue
- 数据绑定:第一个vue例子
- vue模板语法
- vue数据绑定
- el与data的两种写法/延迟挂载
- vue数据代理-Object.definePropert
- vue事件及事件修饰符prevent/stop/
- vue计算属性computed
- vue(深度)监视属性watch
- vue绑定样式:class,:style
- 热门文章
- win7中将文件拷贝到虚拟机linux下
- phpexcel设置行高及列宽,背景颜色,
- rabbitmq无法启动
- intellij idea不显示git push按钮
- php7中使用mongodb的aggregate进行
- laravel页面静态化的方法
- centos7.4 64位下swoole安装及配置
- navicate连接mycat报1184错误
- curl设置超时不起作用(CURLOPT_TIM
- devops-jenkins容器为pending状态
- 好评文章
- phpexcel设置行高及列宽,背景颜色,
- php7中使用mongodb的aggregate进行
- intellij idea打开文件所在文件夹
- windows下使用MongoDB Compass Com
- win7中将文件拷贝到虚拟机linux下
- laravel 中悲观锁 & 乐观锁的使用
- 单点登录sso原理及php实现方式及de
- navicate连接mycat报1184错误
- rabbitmq无法启动
- laravel整合dingo/api方法步骤:jwt
- 我的项目
- 【github】www.github.com/hurong241
- 【码云】gitee.com/hu_rong/projects
- 【docker hub】hub.docker.com/repositories/hurong241
- 【packagist】packagist.org/users/hurong241/packages
- 站点信息
- 建站时间:2011年
- 文章数:623篇
- 浏览数:1303109