Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[译] 用 Vue 3 Composition API 实现 React Context/Provider 模式

[译] 用 Vue 3 Composition API 实现 React Context/Provider 模式

作者头像
江米小枣
发布于 2020-07-06 01:45:51
发布于 2020-07-06 01:45:51
1.8K00
代码可运行
举报
文章被收录于专栏:云前端云前端
运行总次数:0
代码可运行

原文:https://markus.oberlehner.net/blog/context-and-provider-pattern-with-the-vue-3-composition-api/

React Context API 提供了一种 不用在组件树中逐层传递 props (也称 prop drilling)的前提下 共享被多个组件都需要的属性 (比如用户设置、UI 主题等)的方式。尽管 Vue.js 没有自带的完全一致的抽象,但在本文中,我们将看到 在 Vue 3 中,我们已经拥有了可以快速复刻前者功能的所有必需工具。

用户设置 provider

在本例中,来看看如何运用这一模式 让某些信息全局可用

如下的 ProvideUserSettings 组件,提供了一个反应式的 state 及一些默认值,还有一个 update() 函数用以设置 state 对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// src/components/ProvideUserSettings.js

import {
  provide,
  reactive,
  readonly,
  toRefs,
} from 'vue';

// 使用 symbols 制造独特标识
export const UserSettingsStateSymbol = Symbol('User settings state provider identifier');
export const UserSettingsUpdateSymbol = Symbol('User settings update provider identifier');

export default {
  setup() {
    const state = reactive({
      language: 'en',
      theme: 'light',
    });
    
    // 使用 `toRefs()` 确保其在消费者组件中广泛可用
    // 而 `readonly()` 预防了用户修改全局状态
    provide(UserSettingsStateSymbol, toRefs(readonly(state)));

    const update = (property, value) => {
      state[property] = value;
    };
    provide(UserSettingsUpdateSymbol, update);
  },
  render() {
    // 该 provider 组件是 “renderless” 的
    // 其自身不渲染任何东西
    return this.$slots.default();
  },
};

下面来看看如何在应用中使用 ProvideUserSettings 组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- src/App.vue -->

<script>
import ProvideUserSettings from './components/ProvideUserSettings';

export default {
  name: 'App',
  components: {
    ProvideUserSettings,
  },
};
</script>

<template>
  <ProvideUserSettings>
    <div>
      <!-- ... -->
    </div>
  </ProvideUserSettings>
</template>

或许在遍及应用各处的多个组件中都需要这个设置。因此,将 provider 置于顶层的 App 组件中很有必要。

如此一来在组件树中的任意位置都能访问到该用户设置了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- src/components/ButtonPrimary.vue -->

<script>
import { inject } from 'vue';

import { UserSettingsStateSymbol } from './ProvideUserSettings';

export default {
  setup() {
    const { theme } = inject(UserSettingsStateSymbol);
    return { theme };
  },
};
</script>

<template>
  <ButtonBase
    :class="$style[`t-${theme}`]"
  >
    <slot/>
  </ButtonBase>
</template>

<style module>
.t-light { /* ... */ }
.t-dark { /* ... */ }
</style>

如上所示,我们已经看到了如何在 inject() 过的上下文中 消费 用户设置状态 了。

接下来的例子中,将演示如何在应用中的任意组件里 更新 该状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- src/components/ThemeSwitcher.vue -->

<script>
import { inject } from 'vue';

import { UserSettingsUpdateSymbol } from './ProvideUserSettings';

export default {
  setup() {
    const updateUserSettings = inject(UserSettingsUpdateSymbol);
    const updateTheme = value => updateUserSettings('theme', value);

    return { updateTheme };
  },
};
</script>

<template>
  <div>
    <button @click="updateTheme('dark')">
      Enable darkmode
    </button>
    <button @click="updateTheme('light')">
      Enable lightmode
    </button>
  </div>
</template>

这一次我们通过 UserSettingsUpdateSymbol 来 inject() 得到 provider 中的 update() 函数,并将其包裹在一个新的 updateTheme() 函数中,用来直接设置用户设置对象中的 theme 属性。

当两个按钮之一被点击,用户设置就被更新了,并且 因为该状态是一个反应式对象,所有 inject() 了该状态的组件也都将被更新

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云前端 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
通过10个实例小练习,快速入门熟练 Vue3 核心新特性
Vue3.0 发 beta 版都有一段时间了,正式版也不远了,所以真的要学习一下 Vue3.0 的语法了。
夜尽天明
2020/05/13
1.3K0
Vue3 过10种组件通讯方式
众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。
德育处主任
2022/04/17
2K0
Vue3 过10种组件通讯方式
12 种 Vue 设计模式
对于很多状态管理问题来说,最简单的解决方案是使用可组合函数来创建一个可共享的数据存储。
winty
2024/07/08
3190
12 种 Vue 设计模式
Vue3 Composition-Api + TypeScript + 新型状态管理模式探索。
Vue3 Beta 版发布了,离正式投入生产使用又更近了一步。此外,React Hook 在社区的发 展也是如火如荼。
ssh_晨曦时梦见兮
2020/10/15
8000
【Vuejs】1732- 详细聊一聊 Vue3 依赖注入
在 Vue.js 中,依赖注入[1](DI)是一种非常常见的跨组件传递数据的方法,它可以帮助我们更好地管理组件之间的依赖关系。本文将介绍 Vue3 中的依赖注入机制,包括 provide() 和 inject() 函数的使用方法、使用注意以及优缺点和适用场景等方面的内容。
pingan8787
2023/09/01
8440
【Vuejs】1732- 详细聊一聊 Vue3 依赖注入
vue3之Composition API详解
没有Composition API之前vue相关业务的代码需要配置到option的特定的区域,中小型项目是没有问题的,但是在大型项目中会导致后期的维护性比较复杂,同时代码可复用性不高。Vue3.x中的composition-api就是为了解决这个问题而生的
前端进阶之旅
2021/10/16
2.2K0
vue3之Composition API详解
vue3.0新特性初体验(二)
“关注 前端开发社区 ,回复“ 1” 即可加入 前端技术交流群,回复 “ 2” 即可免费领取500G前端干货!
前端老道
2020/09/10
9510
vue3.0新特性初体验(二)
vue3知识点:provide 与 inject
<font color='red'>provide函数:用于给自己的后代组件传递参数</font>
刘大猫
2024/10/31
1220
Vue3 Composition-Api + TypeScript + 新型状态管理模式探索。
一时间大家都觉得Redux很low,都在研究各种各样配合hook实现的新形状态管理模式。
ssh_晨曦时梦见兮
2020/04/11
3.2K0
Vue3 Composition-Api + TypeScript  + 新型状态管理模式探索。
Vue开发仿京东商场app
vue3-jd-h5是一个电商H5页面前端项目,基于Vue 3.0.0 + Vant 3.0.0 实现,主要包括首页、分类页面、我的页面、购物车等,部分效果如下图。
xiangzhihong
2021/01/15
9670
前端系列12集-全局API,组合式API,选项式API的使用
The setup() hook serves as the entry point for Composition API usage in components in the following cases: 在以下情况下, setup() 钩子用作组件中 Composition API 使用的入口点:
达达前端
2023/10/08
5600
@vue/composition-api速成课(通俗易懂版)
Composition API 将是 Vue 3 的核心功能,它具有许多更改和性能改进。我们也可以在 Vue 2 中通过 npm 插件@vue/composition-api 使用它。本人重点将带你了解:
前端迷
2020/09/30
2.9K0
我在vue3.0团队内部的分享
当前还处于 beta版本, 想要正式使用在项目里还需要一段的时间, 但是结构与api变化应该不大了.
肉眼品世界
2021/01/25
5830
快速使用Vue3最新的15个常用API
之前我写了一篇博客介绍了Vue3的新特性,简单了解了一下Vue3都有哪些特色,并且在文末带大家稍微体验了一下Vue3中 Compsition API 的简单使用
若川
2020/12/15
3.4K0
快速使用Vue3最新的15个常用API
Vue3.0 新特性全面探索 - 基于 Composition Api 快速构建实战项目
建议配合 Visual Studio Code 和 Vue 3 Snippets 代码插件食用Ψ( ̄∀ ̄)Ψ。
wscats
2020/06/06
1.4K0
[译] 对比 React Hooks 和 Vue Composition API
原文:https://dev.to/voluntadpear/comparing-react-hooks-with-vue-composition-api-4b32
江米小枣
2020/06/15
6.7K0
vue3的composition-api实践总结
因为向往已久vue3的开发方式,但是组内有很多历史项目,并且我们受制于ie的支持,所以我们决定在vue2中引入composition-api,来使用他的新特性。在使用过程中,我们遇到了很多问题,也积累了一些经验,所以记录下。
winty
2021/07/27
8860
vue3简易入门剖析
,发音同 “veet”)是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
张哥编程
2024/12/13
3930
【Vuejs】738- 一篇文章上手Vue3中新增的API
作者: liulongbin http://www.liulongbin.top:8085/#/?id=_3-setup 1. 初始化项目 // ① npm i -g @vue/cli // ② vu
pingan8787
2020/10/23
8050
【Vuejs】738- 一篇文章上手Vue3中新增的API
element-ui 表格hook 及相关组件
使用例子 <template> <div> <Searchbar :searchBarConf='searchBarConf'/> <Table :tableConf='tableConf'> <div slot="btns" slot-scope="slotProps" v-bind="slotProps.itemProps"> <el-button type='text' @click="onEditor(slotProps)" > 编辑 </e
copy_left
2020/04/16
8900
相关推荐
通过10个实例小练习,快速入门熟练 Vue3 核心新特性
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验