当前位置: 首页 > news >正文

影评网站怎么做一个软件开发的流程

影评网站怎么做,一个软件开发的流程,长沙手机网站公司,建设部施工合同范本目录 前言provideinject 总结 前言 需要从父组件向子组件传递数据时,会使用 props。对于层级不深的父子组件可以通过 props 透传数据,但是当父子层级过深时,数据透传将会变得非常麻烦和难以维护。 而依赖注入则是为了解决 prop 逐级透传 的问…

目录

  • 前言
    • provide
    • inject
  • 总结

前言

需要从父组件向子组件传递数据时,会使用 props。对于层级不深的父子组件可以通过 props 透传数据,但是当父子层级过深时,数据透传将会变得非常麻烦和难以维护。
而依赖注入则是为了解决 prop 逐级透传 的问题而诞生的,父组件 provide 需要共享给子组件的数据,子组件 inject 使用需要的父组件状态数据,而且可以保持响应式。

使用例子

// 父组件
import { provide, ref } from 'vue'
const msg = ref('hello')
provide(/* 注入名 */ 'message', /* 值 */ msg)//子组件使用
import { inject } from 'vue' 
const message = inject('message')

当传入的数据 是响应式数据时, 源数据被修改后 就会派发更新。 所有使用的该数据 (被依赖收集的)组件都会触发更新

provide


export function provide<T, K = InjectionKey<T> | string | number>(key: K,value: K extends InjectionKey<infer V> ? V : T
) {// 必须在setup 方法体 使用if (!currentInstance) {if (__DEV__) {warn(`provide() can only be used inside setup().`)}} else {// 获取当前组件实例上的 provides 对象let provides = currentInstance.provides// 获取父组件实例上的 provides 对象const parentProvides =currentInstance.parent && currentInstance.parent.provides// 一般只有 根组件创建时 两者不等 不需要将子组件的provides 原型指向 父组件的providesif (parentProvides === provides) {provides = currentInstance.provides = Object.create(parentProvides)}// TS doesn't allow symbol as index typeprovides[key as string] = value}
}

看下 instance 初始化时 provides是怎么创建的

 const instance: ComponentInternalInstance = {uid: uid++,vnode,type,parent,appContext,root: null!, // to be immediately setnext: null,subTree: null!, // will be set synchronously right after creationeffect: null!,update: null!, // will be set synchronously right after creationscope: new EffectScope(true /* detached */),render: null,proxy: null,exposed: null,exposeProxy: null,withProxy: null,// 初始化 provides (根组件的parent为null 原型链就会指向 app实例上的 provides)provides: parent ? parent.provides : Object.create(appContext.provides),...
}

关系图:

在这里插入图片描述

inject

export function inject(key, defaultValue, treatDefaultAsFactory = false) {// 获取当前组件实例const instance = currentInstance || currentRenderingInstanceif (instance) {// 获取父组件上的 provides 对象const provides =instance.parent == null? instance.vnode.appContext && instance.vnode.appContext.provides: instance.parent.provides// 如果能取到,则返回值if (provides && key in provides) {return provides[key]} else if (arguments.length > 1) {// 返回默认值return treatDefaultAsFactory && isFunction(defaultValue)// 如果默认内容是个函数的,就执行并且通过call方法把组件实例的代理对象绑定到该函数的this上? defaultValue.call(instance.proxy): defaultValue}
}

核心也就是从当前组件实例的父组件上取 provides 对象,然后再查找父组件 provides 上有没有对应的属性。因为父组件的 provides 是通过原型链的方式和父组件的父组件进行了关联,如果父组件上没有,那么会通过原型链的方式再向上取,这也实现了不管组件层级多深,总是可以找到对应的 provide 的提供方数据

总结

在执行 provide 的时候,会将父组件的的 provides 关联成当前组件实例 provides 对象原型上的属性,当在 inject 获取数据的时候,则会根据原型链的规则进行查找,找不到的话则会返回用户自定义的默认值

http://www.yayakq.cn/news/927663/

相关文章:

  • 濮阳微信网站开发重庆网页制作设计营销
  • 东莞外贸网站搭建制作wordpress内页关键词
  • 网站备案是在哪里的汕头市企业网站建设服务机构
  • 徐汇网站制作设计wordpress.org建站
  • 苏州seo网站推广网站的建设属于无形资产
  • 免费素材网站下载网页设计分为几个部分
  • 宁波网站设计公司企业信用信息公示系统湖北
  • 深圳自建站有哪些大公司wordpress 4.8正式版
  • 江阴做网站哪家好建设银行包头分行网站
  • uemo网站源码企业门户中的基本信息包括
  • 在线看mv视频网站入口软件下载东莞黄页企业名录
  • h5网站建设模板下载深圳燃气公司招聘
  • 襄阳建设路21号创意园网站网站关键词筛选
  • 临淄网站制作首选专家深圳化妆品网站建设
  • 怎么做asp网站国外无版权素材网站
  • 制作博客网站国外网站设计大全
  • 建设网站的题目公司建设网站费用会计怎么记
  • 医疗企业网站模板免费下载做购物网站需要学数据库吗
  • 做展示网站步骤大型网站建设报价
  • 长安网站建设软件吃什么补肾最快
  • 怎样做网站初中生什么网站做唱歌主播
  • 合肥做淘宝网站建设织梦设置中英文网站
  • 怎么做关不掉的网站wordpress主页显示
  • wix建设网站教程做电影网站怎么降低内存
  • 搜索引擎优化诊断手机优化大师
  • 玄天教学网站建设中国商业联盟官网
  • 手机网站宽度自适应iis10 wordpress
  • wordpress服务器加速全是图片的网站怎么做seo
  • 新注册公司网站免费怎么做wordpress pdf
  • 公司网站建设支出计入个人备案网站做商业