Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初探 Vue 3.0 的组装式 API(四)

初探 Vue 3.0 的组装式 API(四)

作者头像
贤羽
发布于 2022-06-09 07:03:39
发布于 2022-06-09 07:03:39
21600
代码可运行
举报
运行总次数:0
代码可运行

这次再说一说父子组件之间的传值与通信场景。

初探 Vue 3.0 的组装式 API(一)

初探 Vue 3.0 的组装式 API(二)

初探 Vue 3.0 的组装式 API(三)

(四)组件通信与跨级传值

1. emit 与 slots

Vue3 中从父级向子级传值与 Vue2 一样,就是在模板里创建子组件的标签时,通过 v-bind:/: 指令传值。

而父组件通过 v-on:/@ 绑定的事件监听器,需要在子组件触发事件时,需要通过 props 之后的第二个参数 context 调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// child.vue
export default {
    setup(props, context) {
        const onClick = () => context.emit('click-child');
        // ...
    },
};

同时,context 中还提供了我们操作子组件时经常需要用到的插槽 slots

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// parent.vue
export default {
    setup(props, context) {
        const { slots } = context;
        const children = (slots.default ? slots.default() : []);
        // ...
    },
};

顺带一提,由于 context 不是响应式的,所以我们可以直接在参数表中,使用解构赋值取出 emitslots

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// parent.vue
export default {
    setup(props, { emit, slots }) {
        // ...
    },
};

不过需要注意,slots 的属性值也可能随时发生变化,但它本身并非响应式数据。为了确保你的组件随时获得最新的插槽状态,建议在 onUpdated 中操作其属性值。

2. 跨级传值

我们有时会遇到类似这样的需求(比如:Tab 与 TabPane),所有子组件需要根据同一个父组件/祖先组件的状态调整自身的状态,做到跨级数据联动。

a) Vue2 方案

在 Vue2 中,是被打散在不同构造参数中的 provideinject 属性实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// tab.vue
exports default {
    data() {
        return {
            tabState: {
                // ...
            };
        },
    },
    // ...
    provide() {
        // 向子孙组件提供 tabState
        const { tabState } = this;
        return {
            tabState,
        };
    },
};

// tab-pane.vue
exports default {
    // 告知可以注入来自祖先的 tabState
    inject: [ tabState ],
    // ...
    methods: {
        getTabState() {
            // 取用 provide 过来的数据
            const { tabState } = this;
            // ...
        },
    },
};

可以看到,又是被打散到不同 data/methods/computed 段落的零散数据,靠 this 强行绑定到一起。

b) Vue3 方案

在 Vue3 中,则是通过 provideinject 函数,更直观地组装出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// tab.vue
import { reactive, provide } from 'vue';
exports default {
    setup() {
        const tabState = reactive({
            // ...
        });
        provide('tabState', tabState);
        // ...
    },
};

// tab-pane.vue
import { inject } from 'vue';
exports default {
    setup() {
        const tabState = inject('tabState');
        // 还可以传入一个默认值: const tabState = inject('tabState', { });
        // ...
    },
};

传入响应式数据后,在子孙组件都可以方便地取到,以至于甚至可以替代很多 Vuex 的使用场景。


这一系列至此告一段落,Vue3 的组装 API 使用起来还是相对简单的,大部分问题都能查阅官方文档解决。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-222,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初探 Vue 3.0 的组装式 API(一)
Vue3 已经更新到 RC9,正式发布在即,其中让人倍加关注的重大更新:组装式 API (Composition API) 到底是什么,相比 Vue2 又有什么优势呢?
贤羽
2022/06/09
4080
前端系列14集-Vue3-setup
页面浏览量(Page View,PV)和访客数(Unique Visitors,UV)
达达前端
2023/10/08
5160
前端系列14集-Vue3-setup
Vue3 + TypeScript 开发实践总结
迟来的Vue3文章,其实早在今年3月份时就把Vue3过了一遍。 在去年年末又把 TypeScript 重新学了一遍,为了上Vue3 的车,更好的开车。 在上家公司4月份时,上级领导分配了一个内部的 党务系统开发 ,这个系统前端是由我一个人来开发,功能和需求也不怎么复杂的一个B 端 系统,直接上的 Vue3 + TypeScript + Element Plus 开发的,开发两周到最后的上线,期间也遇到很多小坑,很多无处可查,慢慢琢磨最后还是克服了。
程序员海军
2021/07/09
1.8K0
Vue3 + TypeScript 开发实践总结
初探 Vue 3.0 的组装式 API(三)
在基础的响应式数据和事件函数之后,我们再来说说 computed 计算属性 和 watch 监听吧。
贤羽
2022/06/09
2250
Vue2向Vue3过渡,持续记录
迁移指南:https://v3.cn.vuejs.org/guide/migration/introduction.html
房东的狗丶
2023/02/17
6.1K0
Vue3, setup语法糖、Composition API全方位解读
支持绑定多个v-model,v-model 是 v-model:modelValue 的简写
yyds2026
2022/09/26
3.2K0
初探 Vue 3.0 的组装式 API(二)
在 RC13 之后,Vue 推出了 3.0 正式版。之前我们尝试了使用新的组装式 API 实现响应式数据,并且和 Vue2 进行了简单对比。
贤羽
2022/06/09
2880
Vue3 中有哪些值得深究的知识点?
众所周知,前端技术一直更新很快,这不 vue3 也问世这么久了,今天就来给大家分享下vue3中值得注意的知识点。喜欢的话建议收藏,点个关注!
玖柒的小窝
2021/12/07
1.1K0
Vue3 中有哪些值得深究的知识点?
Vue3.0 不畏惧祖传代码的 Composition API
昨晚写这篇文章的时候,隔壁在聚餐,几位女生欢聚一堂,整个楼层充满了欢声笑语的味道,就好像早上刷牙刷一半就跑去吃了个鸡蛋。
用户1890129
2020/12/16
5560
Vue2与Vu3组件通信方式总结
我们都知道Vue作为一个轻量级的低门槛入门前端框架,其核心就是 组件化开发 。Vue就是由多个组件组建成的,组件化是它的精髓,更是它的强大之处。各组件实例之间是相互独立的,这也就意味着不同组件之间数据是无法相互共用。
用户7108768
2021/09/22
5170
vue3中可以帮助你早点下班的9个开发技巧!
vue3也发布很长时候了,官方也将默认版本切换为vue3,而且也出现了完善的中文文档,不知同志们是否已经使用了了呢?
用户7413032
2022/04/01
1.1K0
vue3中可以帮助你早点下班的9个开发技巧!
Vue3 的 7 种和 Vue2 的 12 种组件通信,值得收藏
如果父组件是混合写法,子组件纯 Vue3 写法的话,是接收不到父组件里 data 的属性,只能接收到父组件里 setup 函数里传的属性。
Swift社区
2024/10/10
3050
Vue3 的 7 种和 Vue2 的 12 种组件通信,值得收藏
Vue3 过10种组件通讯方式
众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。
德育处主任
2022/04/17
2K0
Vue3 过10种组件通讯方式
【初学者笔记】整理的一些Vue3知识点
拒绝标题党,哈哈哈,看完你就基本可以上手搞开发了,本文适合Vue初学者,或者Vue2迁移者,当然还是建议Vue3官网完全过一遍。不适合精通原理,源码的大佬们。
一尾流莺
2022/12/10
2.4K0
【初学者笔记】整理的一些Vue3知识点
Vue3 | Composition API 包括setup、ref等新特性详解 与 实战
使得相同的、相关的功能代码 可以比较 完整地聚合起来, 提高可维护性、可读性,提高开发效率; 规避 同一个功能的代码, 却散落在 组件定义中的data、methods、computed、directives、template、mixin等各处 的问题;
凌川江雪
2022/01/20
1.5K0
Vue3 | Composition API 包括setup、ref等新特性详解 与 实战
快速使用Vue3最新的15个常用API
之前我写了一篇博客介绍了Vue3的新特性,简单了解了一下Vue3都有哪些特色,并且在文末带大家稍微体验了一下Vue3中 Compsition API 的简单使用
若川
2020/12/15
3.4K0
快速使用Vue3最新的15个常用API
Vue3 初探
3.更友好 提出 composition Api,无论代码的编写还是查看都更加清晰方便
epoos
2022/06/06
7920
一口气复习完 Vue3 相关基础知识点
看完你就基本可以上手搞开发了,本文适合Vue初学者,或者Vue2迁移者,当然还是建议Vue3官网完全过一遍。不适合精通原理,源码的大佬们。
前端达人
2021/09/09
2.3K0
一口气复习完 Vue3 相关基础知识点
前端面试5家公司,被经常问到的vue面试题
在HTML中 slot 元素 ,作为 Web Components 技术套件的一部分,是Web组件内的一个占位符
bb_xiaxia1998
2022/09/22
1.1K0
Vue3组件通信相关的知识梳理
我们知道vue3的Composition Api是它几个最大亮点之一,所以下文都是在setup中演示代码的实现。后面会以开发几个简单form组件为例子来演示。
前端达人
2021/08/10
3.7K0
Vue3组件通信相关的知识梳理
相关推荐
初探 Vue 3.0 的组装式 API(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档