登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 2025年度个人数据报告已发布,快来看看你的成长👉
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
47
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
Vue 组件间通信有哪几种方式?
待办的
#IAGA4H
陌生人
拥有者
创建于
2024-07-29 16:18
<p style="text-align: start;"><strong>1. 方式一: props</strong></p><p style="text-align: start;">1). 实现父向子通信: 属性值是非函数<br>2). 实现子向父通信: 属性值是函数</p><p style="text-align: start;"><strong>2. 方式二: vue自定义事件</strong></p><p style="text-align: start;">1). 用来实现子组件向父组件通信</p><p style="text-align: start;">2). 相关语法:</p><p style="text-align: start;">● 父组件中绑定自定义事件监听: </p><p><code><Child @eventName="callback"></code></p><p style="text-align: start;">● 子组件中分发事件 </p><p style="text-align: start;"><span style="color: rgb(207, 213, 224);"><code>this.$</code></span><span style="color: rgb(66, 132, 174);"><code>emit</code></span><span style="color: rgb(107, 124, 139);"><code>(</code></span><span style="color: rgb(124, 195, 121);"><code>'eventName'</code></span><span style="color: rgb(207, 213, 224);"><code>, data</code></span><span style="color: rgb(107, 124, 139);"><code>)</code></span></p><p style="text-align: start;"><strong>3. 方式三: 全局事件总线</strong></p><p style="text-align: start;">1). 实现任意组件间通信</p><p style="text-align: start;">2). 编码:</p><p style="text-align: start;">● 将入口js中的vm作为全局事件总线对象: </p><pre><code class="language-javascript">beforeCreate() { Vue.prototype.$bus = this }</code></pre><p style="text-align: start;">● 分发事件/传递数据的组件: </p><p style="text-align: start;"><span style="color: rgb(207, 213, 224);">this.$bus.$</span><span style="color: rgb(66, 132, 174);">emit</span><span style="color: rgb(107, 124, 139);">(</span><span style="color: rgb(124, 195, 121);">'eventName'</span><span style="color: rgb(207, 213, 224);">, data</span><span style="color: rgb(107, 124, 139);">)</span></p><p style="text-align: start;">● 处理事件/接收数据的组件: </p><p style="text-align: start;"><span style="color: rgb(207, 213, 224);">this.$bus.$</span><span style="color: rgb(66, 132, 174);">on</span><span style="color: rgb(107, 124, 139);">(</span><span style="color: rgb(124, 195, 121);">'eventName'</span><span style="color: rgb(207, 213, 224);">, </span><span style="color: rgb(107, 124, 139);">(</span><span style="color: rgb(207, 213, 224);">data</span><span style="color: rgb(107, 124, 139);">)</span><span style="color: rgb(207, 213, 224);"> =</span><span style="color: rgb(107, 124, 139);">></span><span style="color: rgb(207, 213, 224);"> </span><span style="color: rgb(107, 124, 139);">{})</span></p><p style="text-align: start;"><strong>4. 方式四: v-model</strong></p><p style="text-align: start;">1). 实现父子之间相互通信</p><p style="text-align: start;">2). 组件标签上的v-model的本质</p><p style="text-align: start;">● 父组件: </p><pre><code class="language-javascript"><CustomInput v-model="name"/> <!-- 等价于 --> <CustomInput :value="name" @input="name=$event"/></code></pre><p style="text-align: start;">● 子组件: </p><pre><code class="language-javascript"><input type="text" :value="value" @input="$emit('input', $event.target.value)"> props: ['value']</code></pre><p style="text-align: start;"><strong>5. 方式五: .sync</strong></p><p style="text-align: start;">1). 实现父子之间相互通信</p><p style="text-align: start;">2). 组件标签的属性上使用.sync的本质</p><p style="text-align: start;">● 父组件:</p><pre><code class="language-javascript"><child :money.sync="total"/> <!-- 等价于 --> <Child :money="total" @update:money="total=$event"/> data () { return { total: 1000 } }</code></pre><p style="text-align: start;">● 子组件:</p><pre><code class="language-javascript"><button @click="$emit('update:money', money-100)">花钱</button> props: ['money']</code></pre><p style="text-align: start;"><strong>6. $attrs与$listeners</strong></p><p style="text-align: start;">1). $attrs</p><p style="text-align: start;">● 实现当前组件的父组件向当前组件的子组件通信</p><p style="text-align: start;">● 它是包含所有父组件传入的标签属性(排除props声明, class与style的属性)的对象</p><p style="text-align: start;">● 使用: 通过 v-bind=”$attrs” 将父组件传入的n个属性数据传递给当前组件的子组件</p><p style="text-align: start;">2). $listeners</p><p style="text-align: start;">● 实现当前组件的子组件向当前组件的父组件通信</p><p style="text-align: start;">● $listeners是包含所有父组件传入的自定义事件监听名与对应回调函数的对象</p><p style="text-align: start;">● 使用: 通过v-on=”$listeners” 将父组件绑定给当前组件的事件监听绑定给当前组件的子组件</p><p style="text-align: start;"><strong>7. $refs, $children, $parent</strong></p><p style="text-align: start;">1). $refs</p><p style="text-align: start;">● 实现父组件向指定子组件通信</p><p style="text-align: start;">● $refs是包含所有有ref属性的标签对象或组件对象的容器对象</p><p style="text-align: start;">● 使用: 通过 this.$refs.child 得到子组件对象, 从而可以直接更新其数据或调用其方法更新数据</p><p style="text-align: start;">2). $children</p><p style="text-align: start;">● 实现父组件向多个子组件通信</p><p style="text-align: start;">● $children是所有直接子组件对象的数组</p><p style="text-align: start;">● 使用: 通过this.$children 遍历子组件对象, 从而可以更新多个子组件的数据</p><p style="text-align: start;">3). $parent</p><p style="text-align: start;">● 实现子组件向父组件通信</p><p style="text-align: start;">● $parent是当前组件的父组件对象</p><p style="text-align: start;">● 使用: 通过this.$parent 得到父组件对象, 从而可以更新父组件的数据</p><p style="text-align: start;"><strong>8. Vuex</strong></p><p style="text-align: start;">1). 实现任意组件间通信</p><p style="text-align: start;">2). Vuex 是一个专为 Vue 应用程序设计的管理多组件共享状态数据的 Vue 插件</p><p style="text-align: start;">● 任意组件都可以读取到Vuex中store的state对象中的数据</p><p style="text-align: start;">● 任意组件都可以通过dispatch()或commit()来触发store去更新state中的数据</p><p style="text-align: start;">● 一旦state中的数据发生变化, 依赖于这些数据的组件就会自动更新</p>
<p style="text-align: start;"><strong>1. 方式一: props</strong></p><p style="text-align: start;">1). 实现父向子通信: 属性值是非函数<br>2). 实现子向父通信: 属性值是函数</p><p style="text-align: start;"><strong>2. 方式二: vue自定义事件</strong></p><p style="text-align: start;">1). 用来实现子组件向父组件通信</p><p style="text-align: start;">2). 相关语法:</p><p style="text-align: start;">● 父组件中绑定自定义事件监听: </p><p><code><Child @eventName="callback"></code></p><p style="text-align: start;">● 子组件中分发事件 </p><p style="text-align: start;"><span style="color: rgb(207, 213, 224);"><code>this.$</code></span><span style="color: rgb(66, 132, 174);"><code>emit</code></span><span style="color: rgb(107, 124, 139);"><code>(</code></span><span style="color: rgb(124, 195, 121);"><code>'eventName'</code></span><span style="color: rgb(207, 213, 224);"><code>, data</code></span><span style="color: rgb(107, 124, 139);"><code>)</code></span></p><p style="text-align: start;"><strong>3. 方式三: 全局事件总线</strong></p><p style="text-align: start;">1). 实现任意组件间通信</p><p style="text-align: start;">2). 编码:</p><p style="text-align: start;">● 将入口js中的vm作为全局事件总线对象: </p><pre><code class="language-javascript">beforeCreate() { Vue.prototype.$bus = this }</code></pre><p style="text-align: start;">● 分发事件/传递数据的组件: </p><p style="text-align: start;"><span style="color: rgb(207, 213, 224);">this.$bus.$</span><span style="color: rgb(66, 132, 174);">emit</span><span style="color: rgb(107, 124, 139);">(</span><span style="color: rgb(124, 195, 121);">'eventName'</span><span style="color: rgb(207, 213, 224);">, data</span><span style="color: rgb(107, 124, 139);">)</span></p><p style="text-align: start;">● 处理事件/接收数据的组件: </p><p style="text-align: start;"><span style="color: rgb(207, 213, 224);">this.$bus.$</span><span style="color: rgb(66, 132, 174);">on</span><span style="color: rgb(107, 124, 139);">(</span><span style="color: rgb(124, 195, 121);">'eventName'</span><span style="color: rgb(207, 213, 224);">, </span><span style="color: rgb(107, 124, 139);">(</span><span style="color: rgb(207, 213, 224);">data</span><span style="color: rgb(107, 124, 139);">)</span><span style="color: rgb(207, 213, 224);"> =</span><span style="color: rgb(107, 124, 139);">></span><span style="color: rgb(207, 213, 224);"> </span><span style="color: rgb(107, 124, 139);">{})</span></p><p style="text-align: start;"><strong>4. 方式四: v-model</strong></p><p style="text-align: start;">1). 实现父子之间相互通信</p><p style="text-align: start;">2). 组件标签上的v-model的本质</p><p style="text-align: start;">● 父组件: </p><pre><code class="language-javascript"><CustomInput v-model="name"/> <!-- 等价于 --> <CustomInput :value="name" @input="name=$event"/></code></pre><p style="text-align: start;">● 子组件: </p><pre><code class="language-javascript"><input type="text" :value="value" @input="$emit('input', $event.target.value)"> props: ['value']</code></pre><p style="text-align: start;"><strong>5. 方式五: .sync</strong></p><p style="text-align: start;">1). 实现父子之间相互通信</p><p style="text-align: start;">2). 组件标签的属性上使用.sync的本质</p><p style="text-align: start;">● 父组件:</p><pre><code class="language-javascript"><child :money.sync="total"/> <!-- 等价于 --> <Child :money="total" @update:money="total=$event"/> data () { return { total: 1000 } }</code></pre><p style="text-align: start;">● 子组件:</p><pre><code class="language-javascript"><button @click="$emit('update:money', money-100)">花钱</button> props: ['money']</code></pre><p style="text-align: start;"><strong>6. $attrs与$listeners</strong></p><p style="text-align: start;">1). $attrs</p><p style="text-align: start;">● 实现当前组件的父组件向当前组件的子组件通信</p><p style="text-align: start;">● 它是包含所有父组件传入的标签属性(排除props声明, class与style的属性)的对象</p><p style="text-align: start;">● 使用: 通过 v-bind=”$attrs” 将父组件传入的n个属性数据传递给当前组件的子组件</p><p style="text-align: start;">2). $listeners</p><p style="text-align: start;">● 实现当前组件的子组件向当前组件的父组件通信</p><p style="text-align: start;">● $listeners是包含所有父组件传入的自定义事件监听名与对应回调函数的对象</p><p style="text-align: start;">● 使用: 通过v-on=”$listeners” 将父组件绑定给当前组件的事件监听绑定给当前组件的子组件</p><p style="text-align: start;"><strong>7. $refs, $children, $parent</strong></p><p style="text-align: start;">1). $refs</p><p style="text-align: start;">● 实现父组件向指定子组件通信</p><p style="text-align: start;">● $refs是包含所有有ref属性的标签对象或组件对象的容器对象</p><p style="text-align: start;">● 使用: 通过 this.$refs.child 得到子组件对象, 从而可以直接更新其数据或调用其方法更新数据</p><p style="text-align: start;">2). $children</p><p style="text-align: start;">● 实现父组件向多个子组件通信</p><p style="text-align: start;">● $children是所有直接子组件对象的数组</p><p style="text-align: start;">● 使用: 通过this.$children 遍历子组件对象, 从而可以更新多个子组件的数据</p><p style="text-align: start;">3). $parent</p><p style="text-align: start;">● 实现子组件向父组件通信</p><p style="text-align: start;">● $parent是当前组件的父组件对象</p><p style="text-align: start;">● 使用: 通过this.$parent 得到父组件对象, 从而可以更新父组件的数据</p><p style="text-align: start;"><strong>8. Vuex</strong></p><p style="text-align: start;">1). 实现任意组件间通信</p><p style="text-align: start;">2). Vuex 是一个专为 Vue 应用程序设计的管理多组件共享状态数据的 Vue 插件</p><p style="text-align: start;">● 任意组件都可以读取到Vuex中store的state对象中的数据</p><p style="text-align: start;">● 任意组件都可以通过dispatch()或commit()来触发store去更新state中的数据</p><p style="text-align: start;">● 一旦state中的数据发生变化, 依赖于这些数据的组件就会自动更新</p>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Vue
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册