父子组件通信

0|1prop

最常见的组件通信方式之一,由父组件传递到子组件

0|2event

最常见的组件通信方式之一,当子组件发生了某些事,可以通过event通知父组件

0|3style和class

父组件可以向子组件传递styleclass,它们会合并到子组件的根元素中

示例

父组件

<template> <div id="app"> <HelloWorld style="color:red" class="hello" msg="Welcome to Your Vue.js App" /> </div> </template> <script> import HelloWorld from "./components9/HelloWorld.vue"; export default { components: { HelloWorld, }, }; </script>

子组件

<template> <div class="world" style="text-align:center"> <h1>{{msg}}</h1> </div> </template> <script> export default { name: "HelloWorld", props: { msg: String, }, }; </script>

渲染结果:

<div id="app"> <div class="hello world" style="color:red; text-aling:center"> <h1>Welcome to Your Vue.js App</h1> </div> </div>

0|4attribute

如果父组件传递了一些属性到子组件,但子组件并没有声明这些属性,则它们称之为attribute,这些属性会直接附着在子组件的根元素上

不包括styleclass,它们会被特殊处理

示例

父组件

<template> <div id="app"> <!-- 除 msg 外,其他均为 attribute --> <HelloWorld data-a="1" data-b="2" msg="Welcome to Your Vue.js App" /> </div> </template> <script> import HelloWorld from "./components/HelloWorld.vue"; export default { components: { HelloWorld, }, }; </script>

子组件

<template> <div> <h1>{{msg}}</h1> </div> </template> <script> export default { name: "HelloWorld", props: { msg: String, }, created() { console.log(this.$attrs); // 得到: { "data-a": "1", "data-b": "2" } }, }; </script>

渲染结果:

<div id="app"> <div data-a="1" data-b="2"> <h1>Welcome to Your Vue.js App</h1> </div> </div>

子组件可以通过inheritAttrs: false配置,禁止将attribute附着在子组件的根元素上,但不影响通过$attrs获取

0|5natvie修饰符

在注册事件时,父组件可以使用native修饰符,将事件注册到子组件的根元素上

示例

父组件

<template> <div id="app"> <HelloWorld @click.native="handleClick" /> </div> </template> <script> import HelloWorld from "./components/HelloWorld.vue"; export default { components: { HelloWorld, }, methods: { handleClick() { console.log(1); }, }, }; </script>

子组件

<template> <div> <h1>Hello World</h1> </div> </template>

渲染结果

<div id="app"> <!-- 点击该 div,会输出 1 --> <div> <h1>Hello World</h1> </div> </div>

0|6$listeners

子组件可以通过$listeners获取父组件传递过来的所有事件处理函数

0|7sync修饰符

v-model的作用类似,用于双向绑定,不同点在于v-model只能针对一个数据进行双向绑定,而sync修饰符没有限制

示例

子组件

<template> <div> <p> <button @click="$emit(`update:num1`, num1 - 1)">-</button> {{ num1 }} <button @click="$emit(`update:num1`, num1 + 1)">+</button> </p> <p> <button @click="$emit(`update:num2`, num2 - 1)">-</button> {{ num2 }} <button @click="$emit(`update:num2`, num2 + 1)">+</button> </p> </div> </template> <script> export default { props: ["num1", "num2"], }; </script>

父组件

<template> <div id="app"> <Numbers :num1.sync="n1" :num2.sync="n2" /> <!-- 等同于 --> <Numbers :num1="n1" @update:num1="n1 = $event" :num2="n2" @update:num2="n2 = $event" /> </div> </template> <script> import Numbers from "./components/Numbers.vue"; export default { components: { Numbers, }, data() { return { n1: 0, n2: 0, }; }, }; </script>

0|8$parent和$children

在组件内部,可以通过$parent$children属性,分别得到当前组件的父组件和子组件实例

0|9$slots和$scopedSlots

  • $slots:用于访问父组件传递的普通插槽中的vnode
  • $scopedSlots:用于访问父组件传递的所有用于生成vnode的函数(包括默认插槽在内)

0|10ref

父组件可以通过ref获取到子组件的实例

1|0跨组件通信

1|1Provide和Inject

示例

// 父级组件提供 'foo' var Provider = { provide: { foo: 'bar' }, // ... } // 组件注入 'foo' var Child = { inject: ['foo'], created () { console.log(this.foo) // => "bar" } // ... }

详见:https://cn.vuejs.org/v2/api/?#provide-inject

1|2router

如果一个组件改变了地址栏,所有监听地址栏的组件都会做出相应反应

最常见的场景就是通过点击router-link组件改变了地址,router-view组件就渲染其他内容

1|3vuex

适用于大型项目的数据仓库

1|4store模式

适用于中小型项目的数据仓库

// store.js const store = { loginUser: ..., setting: ... } // compA const compA = { data(){ return { loginUser: store.loginUser } } } // compB const compB = { data(){ return { setting: store.setting, loginUser: store.loginUser } } }

1|5eventbus

组件通知事件总线发生了某件事,事件总线通知其他监听该事件的所有组件运行某个函数


__EOF__

本文作者shmillly959
本文链接https://www.cnblogs.com/shmillly959/p/18164560.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   shmillly959  阅读(9)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示