• 组件之间的传值——provide和inject


    组件之间的多层传值我们前面学习过了通过$attrs和$listeners,今天我们来学习一个更为简单的方法利用组件对象的属性provide和inject,它们与data、methods这些属于同级。

    用法:在需要提供数据的组件内设置provide,其设置的属性值为对象或者为函数的返回值对象;在需要获取数据的组件内直接用inject注入到当前组件中,不管你处于那一层都能够获取到,inject属性的值为一个字符串数组,或一个对象,对象的情况可具体查看官方API。

    用三个组件演示一下:爷爷组件、父亲组件、孙子组件

    爷爷组件:提供数据

    1. <script>
    2. import Box1 from "@/components/box1.vue"
    3. export default {
    4. data() {
    5. return {
    6. msg:"爷爷组件的数据"
    7. }
    8. },
    9. provide:function(){
    10. return {
    11. msg:this.msg
    12. }
    13. },
    14. components:{
    15. Box1
    16. },
    17. }
    18. script>
    19. <style>
    20. .app{
    21. width: 300px;
    22. height: 300px;
    23. background-color: aquamarine;
    24. }
    25. style>

    父亲组件:可以被注入提供的数据

    1. <script>
    2. import Box2 from "./box2.vue"
    3. export default{
    4. components:{
    5. Box2
    6. },
    7. inject:["msg"]
    8. }
    9. script>
    10. <style>
    11. .box1{
    12. width: 150px;
    13. height: 150px;
    14. background-color: aqua;
    15. }
    16. style>

    孙子组件:也可以获取数据

    1. <script>
    2. export default{
    3. inject:["msg"]
    4. }
    5. script>
    6. <style>
    7. .box2{
    8. width: 100px;
    9. height:100px;
    10. background-color: yellow;
    11. }
    12. style>

     页面效果:

     

    但是它有一个缺点就是数据不是响应式的,如我在爷爷组件方法内修改提供的值,但是子组件中获取的值不会改变。

    演示一下,修改爷爷组件的代码:

    1. <script>
    2. import Box1 from "@/components/box1.vue"
    3. export default {
    4. data() {
    5. return {
    6. msg:"爷爷组件的数据"
    7. }
    8. },
    9. methods: {
    10. change(){
    11. this.msg="修改了"
    12. }
    13. },
    14. // provide:{msg:this.msg}
    15. provide:function(){
    16. return {
    17. msg:this.msg
    18. }
    19. },
    20. components:{
    21. Box1
    22. },
    23. }
    24. script>
    25. <style>
    26. .app{
    27. width: 300px;
    28. height: 300px;
    29. background-color: aquamarine;
    30. }
    31. style>

    当我们点击按钮修改了msg后,只有父组件内页面数据发生了变化,效果:

     解决办法:提供的数据变成一个对象如provide:{msg:{...}},因为对象是一种引用数据,它在内存开辟了一块内存空间。被注入的的组件引用也是指向这块地址,所以能够改变。

    再修改代码:

    1. <script>
    2. import Box1 from "@/components/box1.vue"
    3. export default {
    4. data() {
    5. return {
    6. msg:{msg:"对象形式传入"}
    7. }
    8. },
    9. methods: {
    10. change(){
    11. this.msg="修改了"
    12. }
    13. },
    14. // provide:{msg:this.msg}
    15. provide:function(){
    16. return {
    17. msg:this.msg
    18. }
    19. },
    20. components:{
    21. Box1
    22. },
    23. }
    24. script>
    25. <style>
    26. .app{
    27. width: 300px;
    28. height: 300px;
    29. background-color: aquamarine;
    30. }
    31. style>

     修改子组件中{{msg}}-->{{msg.msg}}

    再次点击按钮查看效果:

     

  • 相关阅读:
    java Boolean 比较
    【深度学习】 Python 和 NumPy 系列教程(一):Python基本数据类型:1、数字(整数、浮点数)及相关运算;2、布尔值
    SQL数据迁移实战:从产品层级信息到AB测试表
    移远通信联合产业中坚力量共同发起倡议,推动5G RedCap技术演进和应用创新发展
    HBase1.4.6安装搭建及shell命令使用
    jupyter使用tensorflow遇到的问题
    (Ljava/lang/String;)Ljava/lang/Integer; @65: areturn
    Opencv算术操作
    Spring Boot问题汇总
    【数据结构】静态分配的顺序表插入元素
  • 原文地址:https://blog.csdn.net/m0_59345890/article/details/126769791