首页 > 其他分享 >provide和使用computed跨组件传值

provide和使用computed跨组件传值

时间:2023-03-12 14:22:14浏览次数:31  
标签:computed provide data inject 组件 数据 传值 name

provide和inject

provide用于跨组件的传值。在祖先组件的data中提供一个对象,该对象可被注入到子孙组件中,不论组件的层级有多深。但是必须要是嵌套关系,才能实现注入

provide和inject需要一起使用,provide进行传递inject进行注入,实现祖先组件向后代组件进行传值。

传值操作

data中创建一个对象数据,然后provide进行传递,inject进行接收

<template>
<hello-world></hello-world>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
  name: 'App',
  data () {
    return {
      obj : {
        name : 'jack',
        age : 18
      }
    }
  },
  methods : {
    chenge() {
      console.log(1)
      this.obj.name =  'Welcome to Your Vue.js App111'
    }
  },
  components: {
    HelloWorld
  },
  provide () {
    return {
      obj: this.obj.name, // 这里的值,是基本值,和data中的数据没有关系
    obj: this.obj // 需要传递一个对象,而且这个对象还要再data中进行了声明
      chenge: this.chenge // 如果是基本值,跟data的数据没有关系,修改的话是修改不了的
    }
  }
}
</script>
<style lang="less">
</style>

子组件进行数据的接收和修改

<template>
  <div>
    <h1>{{obj}}</h1>
    <div>
      <button @click="chenge">点击修改</button>
    </div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  inject : ['obj','chenge'],
}
</script>

<style scoped lang="less">

</style>

注意点

provide属性不是响应式数据,provide里面的数据和data中的数据不是一个数据,provide里面的数据是对data中的数据进行解析获取的。

如果我们想让provide里面的数据是响应式数据,inject可以对其修改。我们首先需要再data中声明一个对象,然后给provide赋值一个对象,在methods中声明一个方法,修改data中的数据。最后给provide赋值一个修改数据的方法,进行传递。inject进行数据和方法的接收,就可以完成数据的修改。

为什么一个要赋值一个对象才可以被修改?因为如果赋值一个基本值,会被解析传递,解析传递和data数据都不是同一个数据。如果是对象数据,不会被解析传递,和data数据是同一个数据。

这样做起来比较麻烦,子组件的数据,需要在父组件中进行声明还必须要声明一个对象。使用Vue.observable()进行响应式的实现。

Vue.observable()响应式的实现

创建一个observable.js文件使用Vue.observable方法把一个普通数据处理成响应式数据

observable.js文件作为公共的存放数据的地方

import Vue from 'vue'
// 可以把一个普通数据处理成响应式数据
export const info = Vue.observable({
    name: '王路飞',
})
//进行方法的声明,修改普通数据
export const close = () => {
    info.name = '黑胡子'
}

App.vue页面直接进行页面的传值

<template>
<hello-world></hello-world>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
import { info , close } from "@/oberver";
export default {
  name: 'App',
  components: {
    HelloWorld
  },
  provide () {
    return {
      info,
      close
    }
  }
}
</script>
<style lang="less">
</style>

子组件进行数据的接收

<template>
  <div>
    <h1>{{info.name}}</h1>
    <div>
      <button @click="close">点击修改</button>
    </div>
  </div>
</template>
<script>
export default {
  name: 'HelloWorld',
  inject : ['info','close'],
}
</script>
<style scoped lang="less"></style>

这样,就解决了,传递的数据必须是对象,而且必须要在父组件中进行数值的声明

 

标签:computed,provide,data,inject,组件,数据,传值,name
From: https://www.cnblogs.com/hgng/p/17208070.html

相关文章

  • ContentProvider初涉
    ContentProvider(内容提供者)是安卓四大组件之一它的主要作用:我们想在自己的应用中访问别的应用或者ContentProvider暴露给我们的一些数据如联系人或短信等。并且想对这......
  • vue computed正确使用方式
    最近面试中,遇到一个小伙子,谈到了vue中的​​computed​​​和​​watch​​区别,最后得到了一个让我瞠目结舌的答案,只用​​watch​​,从不用​​computed​​模板内的......
  • uni-app 组件传值 props 对象中传有方法, 小程序上被过滤
    uni-app组件传值props对象中传有方法,微信小程序上会被过滤,uniapp小程序props传值丢失uniapp中父组件向子组件传递prop时,如果prop是对象,对象内部不能包含function属......
  • DelegateAuthenticationProvider not found after updating Microsoft Graph
    c#-DelegateAuthenticationProvidernotfoundafterupdatingMicrosoftGraph-StackOverflow回答msgraph-sdk-dotnet/upgrade-to-v5.mdatfeature/5.0·micros......
  • .NET6 MVC 传值的五种方式
    //Controller:ViewBag.User1="张三";ViewData["User2"]="李四";TempData["User3"]="王五";HttpContext.Sessio......
  • ContentProvider+BroadCast的使用
    内容提供者的官方定义如下:  首先是ContentProvider的使用,翻译成中文就是内容提供者,作用就是比如我在从微信往qq传一张图片,我需要一个内容提供者,这里我的微信里面的图......
  • #yyds干货盘点#vue3 语法糖setup 兄弟组件传值
    使用mitt//全局引入npminstallmitt或者cnpminstallmitt在main文件中挂载import{createApp}from'vue'importAppfrom'./App.vue'importmittfrom'mitt'//导......
  • vue 中 computed属性中的get与set;
    1.computed是对⾃⼰定义的变量进⾏监控,这⾥的变量不是在data中定义,直接在computed中定义,然后变量放到展⽰页⾯后就实现了数据的双向绑定,当变量发⽣改变是就会触发计算,说到......
  • vue 父子组件之间传值
    在vue中父子组件传值是必不可少的,大家必须要学会! 首先父组件向子组件传值: 父组件:比如我们传teacher为index,如果我们传值变量可以使用:绑定我们在data中定义的变量。......
  • 11_08_第六阶段:大前端进阶||07-Vue详解||P10:计算属性(computed)【观看狂神随笔】
    Vue:计算属性,内容分发,自定义事件1.什么是计算属性计算属性:计算出来的结果,保存到属性中~,内存中运行:虚拟Dom计算属性(computed)VS方法(methods)代码:<!DOCTYPEhtml><htmllang="en......