vue 解决provide和inject响应的问题


Posted in Javascript onNovember 12, 2020

官网上说provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。

provide:

Object | () => Object(一个对象或返回一个对象的函数)

inject:

Array | { [key: string]: string | Symbol | Object }(一个字符串数组,或一个对象,对象的 key 是本地的绑定名)

要实现父子组件响应,父组件传递的数据类型必须是对象Object,子组件接收的数据类型必须是对象Object,其他数据类型都是不好使的

provide和inject响应的例子:

父组件:

<template>
 <div class="menu">
  <label>父组件输入框:</label>
  <input v-model="level.name" @change="levelChange(level.name)"/>
  <!-- 子组件 -->
  <my-list></my-list>
 </div>
</template>
<script>
import MyList from '@/pages/user/children/MyList'

export default {
 components:{MyList},

 provide(){
  return {
   userLevel:this.level,
  } 
 },

 data(){
  return{
   level:{name:"初始化"},
  } 
 },

 methods:{
  levelChange(val){
   this.userLevel = this.level;
   console.log(this.userLevel )//可以打印出对象属性name值改变了
  }
 }
}
</script>

子组件(MyList.vue)

<template>
 <div class="my-list"> 
  <p>子组件接收数据:{{userLevel.name}}</p>
  <label>父组件输入框:</label><input type="text" v-model="userLevel.name">
 </div>
</template>
<script>
export default {
 // inject:['userLevel'],
 inject:{
  userLevel:{
   default:()=>{}
  },
 },

 data(){
  return{
  }
 } 
}
</script>

输出:

初始化:

vue 解决provide和inject响应的问题

修改父组件数据:输入框的值是"初始",子组件也输出"初始

vue 解决provide和inject响应的问题

修改子组件数据:输入框的值是"子组件",父组件输入框也显示"子组件"

vue 解决provide和inject响应的问题

好啦,provide和inject实现响应,父组件的数据修改影响了子组件的更新,子组件的数据修改同样影响了父组件的更新。

数据格式为对象Object的类型,父组件修改数据影响子组件,子组件修改数据影响父组件,感觉和对象的存储有关,对象格式数据存储的是指针而不是数据,所以父子组件其实是用的同一个对象,修改的也是同一个对象,因此会实现双向响应改变,不知道我这样理解的是由有问题。

补充知识:vue监听赋值值以及provide与inject

vue 当父组件 改变 子组件的props 却不变

watch: {
 'oState': function (val,oldval) {
  this.getOrderList({orderStatus: this.getOrderState(this.oState), pageSize: 1})
 },
 // 深度 watcher
  c: {
  handler: function (val, oldVal) { /* ... */ },
  deep: true
  },
 },

$refs

<ul class="comment-list" v-if="list" ref="commentList"></ul>
 scrollToTop () {
 this.$refs.commentList.scrollTop = 0
 }

$el

this.$refs.studentListDialog.$el.querySelector('.el-dialog')

vm.$once( event, callback )

参数:

{string} event

{Function} callback

用法:

监听一个自定义事件,但是只触发一次,在第一次触发之后移除监听器。

vm.$off( [event, callback] )

参数:

{string | Array<string>} event (只在 2.2.2+ 支持数组)

{Function} [callback]

用法:

移除自定义事件监听器。

如果没有提供参数,则移除所有的事件监听器;

如果只提供了事件,则移除该事件所有的监听器;

如果同时提供了事件与回调,则只移除这个回调的监听器。

vm.$destroy()

用法:

完全销毁一个实例。清理它与其它实例的连接,解绑它的全部指令及事件监听器。

触发 beforeDestroy 和 destroyed 的钩子。

当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去

obj:{
 arr:[]
 }

双向绑定后无法直接改变obj.arr

需要新增一个arr赋值或者

this.$set(this.ruleForm, 'date', time)

vue.set(target,key,value)

参数

{object | Array} target

{string | number} key

{any} value

this.$set()和Vue.set()本质方法一样,前者可以用在methods中使用。

set方法调用时,可以触发页面全部重新渲染。

provide:Object | () => Object

inject:Array<string> | { [key: string]: string | Symbol | Object }

这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。如果你熟悉 React,这与 React 的上下文特性很相似。

provide 选项应该是一个对象或返回一个对象的函数。该对象包含可注入其子孙的属性。在该对象中你可以使用 ES2015 Symbols 作为 key,但是只在原生支持 Symbol 和 Reflect.ownKeys 的环境下可工作。

inject 选项应该是:

一个字符串数组,或

一个对象,对象的 key 是本地的绑定名,value 是:

在可用的注入内容中搜索用的 key (字符串或 Symbol),或

一个对象,该对象的:

from 属性是在可用的注入内容中搜索用的 key (字符串或 Symbol)

default 属性是降级情况下使用的 value

提示:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。

示例:

// 父级组件提供 ‘foo'

 var Provider = {
 provide: {
  foo: 'bar'
 },
 // ...
 }

// 子组件注入 'foo'

 var Child = {
 inject: ['foo'],
 created () {
  console.log(this.foo) // => "bar"
 }
 // ...
 }

以上这篇vue 解决provide和inject响应的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
教你在heroku云平台上部署Node.js应用
Jul 30 Javascript
jQuery中:hidden选择器用法实例
Dec 30 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
Nov 18 Javascript
基于jQuery实现动态搜索显示功能
May 05 Javascript
javascript常用的设计模式
Feb 09 Javascript
JS原生带小白点轮播图实例讲解
Jul 22 Javascript
JS实现微信摇一摇原理解析
Jul 22 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
Dec 05 Javascript
Fetch超时设置与终止请求详解
May 18 Javascript
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
vue的$http的get请求要加上params操作
Nov 12 #Javascript
vue 获取url参数、get参数返回数组的操作
Nov 12 #Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 #Javascript
vue 获取url里参数的两种方法小结
Nov 12 #Javascript
带你使用webpack快速构建web项目的方法
Nov 12 #Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 #Javascript
详解vue 组件的实现原理
Nov 12 #Javascript
You might like
全国中波电台频率表
2020/03/11 无线电
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
PHP echo()函数讲解
2019/02/15 PHP
js 对象是否存在判断
2009/07/15 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
JS实现吸顶特效
2020/01/08 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Python中几种操作字符串的方法的介绍
2015/04/09 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
Python PIL图片添加字体的例子
2019/08/22 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
python装饰器使用实例详解
2019/12/14 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
高中升旗仪式演讲稿
2014/09/09 职场文书
村委会贫困证明范本
2014/09/17 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
女性励志书籍推荐
2019/08/19 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
redis复制有可能碰到的问题汇总
2022/04/03 Redis
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技