vueuse/core之computedInject函数

把computed和inject的功能组合起来,用于对注入的数据进行响应式计算

能够在依赖注入inject的时候,进一步对数据进行加工

demo

context.ts 像普通provide/inject定义的一样,定义数据类型,内容如下:

ts 复制代码
import  { InjectionKey } from "vue";
interface Item{
  key:number,
  value:string
}
export const ArrayKey:InjectionKey<Item[]> = Symbol('symbol-key')

在父组件像普通provide一样,提供数据

vue 复制代码
<template>
  <h1>Parent父级节点</h1>
  <div>{{array }}<button @click="handleChange">改变</button></div>
  <hr>
  <Childer></Childer>
</template>

<script setup lang="ts">
import { ref, provide } from 'vue'
import Childer from './components/Childer.vue';
import { ArrayKey } from './components/context';

const array = ref([
  {
    key:1,
    value:'苹果'
  },
  {
    key:2,
    value:'香蕉'
  }
])
provide(ArrayKey, array.value)

function handleChange () {
  array.value[0].value = '橘子'+Math.random()
}
</script>

在后代组件中,用computedInject()代替普通的inject()

vue 复制代码
<template>
  <h1>这是子组件</h1>
  {{ fooArr }}
</template>
<script lang="ts" setup>
import { inject, watchEffect } from 'vue';
import {computedInject} from '@vueuse/core'
import {ArrayKey } from './context';
const fooArr = computedInject(ArrayKey, (source) => {
  if (!source) {
    return []
  }
  const arr = [...source]
    arr.unshift({
        key:0,
        value:'水果'
    })
    return arr
});

</script>

api参数

1、默认值

和vue的inject()一样,支持3个参数

ts 复制代码
// 源码如下
export function computedInject(key, options, defaultSource, treatDefaultAsFactory) {
    source = inject(key, defaultSource, treatDefaultAsFactory) as T
}

可以看出computedInject()的第1/3/4参数是原样传给vue的inject()

而vue的inject()参数可以看官网

2、第2个参数

第2个参数可以是一个函数,也可以是一个含有 {get(){}, set(){}} 的对象

ts 复制代码
const result = computedInject(ArrayKey, {
  get (neVal) {
    return []
  },
  set (neVal) {
  }
});

源码

ts 复制代码
// key,defaultSource,treatDefaultAsFactory 原样传给
export function computedInject(key,options,defaultSource,treatDefaultAsFactory) {
  let source = inject(key)
  if (defaultSource)
    source = inject(key, defaultSource)
  if (treatDefaultAsFactory)
    source = inject(key, defaultSource, treatDefaultAsFactory)

  if (typeof options === 'function') {
    return computed(ctx => options(source, ctx))
  }
  else {
    return computed({
      get: ctx => options.get(source, ctx),
      set: options.set,
    })
  }
}
相关推荐
ji_shuke7 分钟前
远程排查 Web 系统问题:如何导出 HAR 文件协助定位
前端·问题排查
程序员爱钓鱼34 分钟前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust
码农学院39 分钟前
GEO与SEO协同:从传统搜索到生成式搜索的平滑迁移路径
服务器·前端·python
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny9 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹9 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny9 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn10 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker10 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜11 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery