vue中组件的传递取值方式总结

news2025/1/24 17:56:20

vue中组件的传递取值方式总结

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.父子传参
      • 2.vue 子组件接收数据进行渲染或处理
      • 3.父组件通过v-on监听自定义事件并取得传递的值
      • 4.ref引用子组件
      • 5.通过provide/inject传值
      • 6.attrs和listeners
      • 7.通过vuex进行全局状态管理
      • 8.Vue mixin
      • 9.通过provide/inject实现跨级组件通信
      • 10.parent和children实现父子组件通信
  • 参考资料和推荐阅读

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

需求:

设计思路

实现思路分析

1.父子传参

父组件通过props属性将数据传递给子组件的步骤如下:

  1. 在父组件中定义要传递的数据,并将其作为props属性传递给子组件。例如:
import React from 'react';
import ChildComponent from './ChildComponent';

class ParentComponent extends React.Component {
  render() {
    const data = "Hello, world!";
    return (
      <div>
        <ChildComponent message={data} />
      </div>
    );
  }
}

export default ParentComponent;
  1. 在子组件中接收通过props传递的数据。例如:
import React from 'react';

class ChildComponent extends React.Component {
  render() {
    return (
      <div>
        <p>{this.props.message}</p>
      </div>
    );
  }
}

export default ChildComponent;

在子组件中,可以通过this.props来访问传递的数据,这里的this.props.message即为父组件传递的数据。

通过以上步骤,父组件就可以将数据通过props属性传递给子组件了。

2.vue 子组件接收数据进行渲染或处理

在Vue.js中,子组件可以通过props属性来接收父组件传递过来的数据进行渲染或处理。下面是一个例子:

在父组件中,我们定义一个属性并传递给子组件:

<template>
  <div>
    <child-component :message="message"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: 'Hello, World!'
    };
  }
};
</script>

在子组件中,我们通过props接收父组件传递的数据,并进行渲染或处理:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="reverseMessage">Reverse</button>
  </div>
</template>

<script>
export default {
  props: ['message'],
  methods: {
    reverseMessage() {
      this.message = this.message.split('').reverse().join('');
    }
  }
};
</script>

在子组件中,我们使用props: ['message']来定义一个props属性,这样就可以接收父组件传递过来的message数据。然后我们可以在子组件的模板中使用{{ message }}来渲染这个数据。

另外,我们还可以在子组件中定义方法来处理这个数据。在这个例子中,我们定义了一个reverseMessage方法,用于反转message数据。当点击按钮时,会调用这个方法来改变message的值。

总结一下,子组件可以通过props属性来接收父组件传递过来的数据,并且可以在组件的模板和方法中使用这些数据进行渲染和处理。

3.父组件通过v-on监听自定义事件并取得传递的值

在父组件中,你可以通过v-on指令来监听子组件触发的自定义事件,并取得传递的值。以下是一个示例:

父组件模板:

<template>
  <div>
    <h2>父组件</h2>
    <p>{{ message }}</p>
    <child-component 
      v-on:custom-event="handleCustomEvent">
    </child-component>
  </div>
</template>

父组件脚本:

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: ''
    }
  },
  methods: {
    handleCustomEvent(value) {
      this.message = value;
    }
  }
}
</script>

子组件模板:

<template>
  <div>
    <h2>子组件</h2>
    <button v-on:click="emitCustomEvent">触发自定义事件</button>
  </div>
</template>

子组件脚本:

<script>
export default {
  methods: {
    emitCustomEvent() {
      const value = 'Hello, World!';
      this.$emit('custom-event', value);
    }
  }
}
</script>

在父组件中使用v-on指令监听子组件的custom-event事件,并在父组件的handleCustomEvent方法中接收传递的值。然后将值赋给父组件的message属性,从而动态更新父组件的模板中的message内容。当子组件中的按钮被点击时,会触发自定义事件,并将’value’传递给父组件。

4.ref引用子组件

要在 Vue 中通过 ref 引用子组件,可以按照以下步骤进行操作:

  1. 在父组件中,使用 ref 属性给子组件命名。例如:<child-component ref="child"></child-component>
  2. 在父组件中,可以通过 this.$refs 来访问子组件的实例。例如:this.$refs.child 可以获取到子组件的实例。
  3. 使用子组件实例的属性或方法来传递值。例如:this.$refs.child.value = 'Hello' 可以在子组件中设置一个名为 value 的属性,并将其值设置为 'Hello'

下面是一个完整的例子:

<template>
  <div>
    <child-component ref="child"></child-component>
    <button @click="passValue">传递值给子组件</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    passValue() {
      this.$refs.child.value = 'Hello';
      console.log(this.$refs.child.value); // 输出 'Hello'
    }
  }
}
</script>
<!-- ChildComponent.vue -->
<template>
  <div>
    {{ value }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      value: ''
    }
  }
}
</script>

在上面的例子中,父组件通过 ref 属性给子组件命名为 child,然后在 passValue 方法中,通过 this.$refs.child.value 来设置子组件的 value 属性,并将其值设置为 'Hello'。最后,我们可以在子组件中显示 value 的值。

5.通过provide/inject传值

在Vue中,可以使用provideinject来在父组件和子组件之间进行值的传递。

首先,在父组件中,使用provide来提供要传递的值。例如:

// 父组件
provide() {
  return {
    message: 'Hello, Vue!'
  };
}

然后,在子组件中,使用inject来注入传递的值。例如:

// 子组件
inject: ['message'],
mounted() {
  console.log(this.message); // 输出: Hello, Vue!
}

在这个例子中,父组件通过provide提供了message的值为'Hello, Vue!',子组件通过injectmessage注入到子组件中,并在mounted生命周期钩子中使用。

需要注意的是,provideinject并不是响应式的,也就是说如果提供的值发生变化,子组件不会自动更新。如果需要实现响应式的值传递,可以考虑使用propsemit来实现。

6.attrs和listeners

在Vue中,您可以使用$attrs$listeners来获取父组件传递的属性和事件。

$attrs是一个包含了父组件传递的所有属性的对象。您可以在子组件的模板中通过v-bind指令将$attrs中的属性绑定到子组件的相应属性上。例如:

<template>
  <div>
    <p>{{ $attrs.foo }}</p>
    <p>{{ $attrs.bar }}</p>
  </div>
</template>

在上面的例子中,父组件可以通过以下方式传递属性给子组件:

<child-component foo="Hello" bar="World"></child-component>

子组件将会显示父组件传递的属性值。

$listeners是一个包含了父组件传递的所有事件监听器的对象。您可以在子组件的模板中通过v-on指令将$listeners中的事件绑定到子组件的相应事件上。例如:

<template>
  <button v-on="$listeners">{{ $attrs.buttonText }}</button>
</template>

在上面的例子中,父组件可以通过以下方式传递事件给子组件:

<child-component buttonText="Click me" @click="handleClick"></child-component>

当子组件的按钮被点击时,父组件定义的handleClick方法将会被调用。

请注意,$attrs$listeners只会包含没有被子组件的props和事件监听器所接收的属性和事件。如果您希望将父组件的所有属性和事件传递给子组件,可以使用v-bind="$attrs"v-on="$listeners"来简化代码。例如:

<template>
  <child-component v-bind="$attrs" v-on="$listeners"></child-component>
</template>

这样,父组件的所有属性和事件都会被传递给子组件。

7.通过vuex进行全局状态管理

创建全局store对象来存储数据

8.Vue mixin

Vue mixin 可以用来共享组件之间的代码。您可以在 mixin 中定义一个方法来获取数据,并在需要这些数据的组件中混入这个 mixin。

首先,定义一个 mixin,例如:

// myMixin.js
export default {
  methods: {
    fetchData() {
      // 获取数据的代码
      return fetch('https://api.example.com/data')
        .then(response => response.json())
        .then(data => {
          // 处理数据
          // 返回处理后的数据
          return data;
        });
    }
  }
}

然后,在需要获取数据的组件中混入这个 mixin:

// MyComponent.vue
import myMixin from './myMixin';

export default {
  mixins: [myMixin],
  created() {
    this.fetchData().then(data => {
      // 在这里处理获取的数据
    });
  }
}

上述代码中,MyComponent 组件混入了 myMixincreated 生命周期钩子中调用了 fetchData 方法来获取数据,并在 then 中进行数据处理。

混入的方法会被合并到组件中,因此您可以在组件中直接调用混入的方法。混入的数据和方法会在组件的实例中生效。

9.通过provide/inject实现跨级组件通信

在Vue中,可以使用provide和inject来实现跨级组件通信。provide是在父组件中声明数据,而inject是在子组件中注入数据。

下面是一个示例:

// 父组件
<template>
  <div>
    <child-component></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  provide() {
    return {
      message: 'Hello from parent component'
    };
  }
};
</script>
// 子组件
<template>
  <div>
    <grand-child-component></grand-child-component>
  </div>
</template>

<script>
import GrandChildComponent from './GrandChildComponent.vue';

export default {
  components: {
    GrandChildComponent
  },
  inject: ['message']
};
</script>
// 孙子组件
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  inject: ['message']
};
</script>

在上面的示例中,父组件通过provide提供了一个名为message的数据,子组件通过inject注入了这个数据,并在模板中展示出来。孙子组件也通过inject注入了message数据,并展示出来。

这样,父组件的数据就可以通过inject在子组件和孙子组件中共享和使用了,实现了跨级组件通信。

10.parent和children实现父子组件通信

在Vue中,父子组件间的通信可以通过props和事件来实现。

  1. 使用props向子组件传递数据:
    在父组件中,可以通过props属性将数据传递给子组件。子组件中可以通过this.$props访问传递过来的属性。

    // Parent.vue
    <template>
      <div>
        <Child :message="message" />
      </div>
    </template>
    
    <script>
    import Child from './Child.vue';
    
    export default {
      components: {
        Child
      },
      data() {
        return {
          message: 'Hello from Parent!'
        };
      }
    };
    </script>
    
    // Child.vue
    <template>
      <div>
        <p>{{ message }}</p>
      </div>
    </template>
    
    <script>
    export default {
      props: ['message'],
      mounted() {
        console.log(this.$props.message); // Output: Hello from Parent!
      }
    };
    </script>
    
  2. 使用事件向父组件传递数据:
    在子组件中,可以通过$emit方法触发一个自定义事件,并将数据作为参数传递给父组件。父组件可以通过@event-name的方式监听子组件触发的事件,并在对应方法中处理数据。

    // Parent.vue
    <template>
      <div>
        <Child @update-message="updateMessage" />
      </div>
    </template>
    
    <script>
    import Child from './Child.vue';
    
    export default {
      components: {
        Child
      },
      data() {
        return {
          message: ''
        };
      },
      methods: {
        updateMessage(newMessage) {
          this.message = newMessage;
        }
      }
    };
    </script>
    
    // Child.vue
    <template>
      <div>
        <button @click="sendMessage">Send Message</button>
      </div>
    </template>
    
    <script>
    export default {
      methods: {
        sendMessage() {
          this.$emit('update-message', 'Hello from Child!');
        }
      }
    };
    </script>
    

通过props和事件,父子组件之间就可以实现双向通信。父组件可以向子组件传递数据,子组件也可以通过触发事件的方式向父组件传递数据。

参考资料和推荐阅读

参考资料
官方文档
开源社区
博客文章
书籍推荐

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!同时,期望各位大佬的批评指正~,如果有兴趣,可以加文末的交流群,大家一起进步哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1383594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速查询自己哔哩哔哩账号的注册时间

登录自己哔哩哔哩 访问下面地址 https://member.bilibili.com/x2/creative/h5/calendar/event?ts0 打开后&#xff0c;在网页中查找“jointime”&#xff0c;join time&#xff0c;“加入时间”&#xff0c; 如下图&#xff0c;“jointime”冒号后面的一串数字&#xff0c;是…

汽车ECU的虚拟化技术初探(四)--U2A内存管理

目录 1.内存管理概述 2. 内存保护功能 2.1 SPID 2.2 Slave Guard 3.小结 1.内存管理概述 为了讲清楚U2A 在各种运行模式、特权模式下的区别&#xff0c;其实首先应该搞清楚不同模式下可以操作的寄存器有哪些。 但是看到这个寄存器模型就头大。 再加上之前没有研究过G4MH…

网页设计-用户体验

Use Cases (用例) 用例是用户如何在网站上执行任务的书面描述&#xff0c;从用户的角度描述了系统响应请求时的行为。每个用例都是用户实现目标的一系列简单的步骤。简言之&#xff0c;用例是一种用于描述系统如何满足用户需求的方法。 用例的好处 1. 明确需求&#xff1a; Use…

掌握WPF控件:熟练常用属性(二)

WPF布局常用控件&#xff08;二&#xff09; Calendar 用于日期选择的控件。它提供了一个可视化的界面&#xff0c;可以通过它来选择特定的日期。 常用属性描述DisplayMode用来设置Calendar的显示模式&#xff0c;有三种可选值&#xff1a;默认Month&#xff08;月&#xff…

详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;首期文章 &#x1f4da;订阅专栏&#xff1a;微服务技术全家桶 希望文章对你们有所帮助 在此之前&#xff0c;耗时半个月&#x…

高效学习新编程语言的实践指南

学习一门新的编程语言或框架对于新手和有经验的程序员来说都是一个挑战。然而&#xff0c;通过采用一些有效的策略和方法&#xff0c;我们可以快速入门并掌握新的编程工具。本文将从新手和有编程经验两个不同的角度&#xff0c;分享一些实用的建议和技巧&#xff0c;帮助读者在…

Echarts图表如何利用formatter自定义tooltip的内容和样式

在展示多数据图表的时候 有的时候需要图例也展示出一些内容来&#xff0c;例如官方这样子&#xff1a;鼠标悬停的时候展示该点数据 但是&#xff0c;官方提供的样式有时不适用所有的开发场景 我的项目需要实现鼠标悬停在某一点的时候&#xff0c;只展示该条线的数据&#xff0…

【python】进阶--->MySQL数据库(三)

一、修改列的类型长度及约束 alter table 表名 modify 列名 类型(长度) [约束];修改列名 : alter table 表名 change 旧列名 新列名 类型(长度) [约束];二、数据查询语言 查询表中所有的数据 : select * from 表名; 查询表中部分列数据 : select 列名1, 列名2 from 表名;1. …

长亭科技-雷池WAF的安装与使用

目录 1、安装雷池 2、登录雷池 3、简单配置 4、防护测试 5、其他补充 1、安装雷池 在Linux系统上执行如下命令 &#xff08;需要docker环境&#xff0c;提前把docker、docker-compose 装好&#xff09; bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release…

MySQL8.0安装(Linux - centos)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 其他…

企业异地访问办公系统:对比运营商MPLS专线,内网穿透有何优势?

为了实现连锁门店、企业内部各地分支机构ERP、OA、远程监控、自建邮件服务器、智能网络设备等数据传输、互访&#xff0c;使用运营商专线或是采用内网穿透方案&#xff0c;彼此之间究竟有何区别呢&#xff1f; 简单来说&#xff0c;MPLS专线和普通宽带类似是运营商提供的网络租…

【GitHub项目推荐--国外大神复刻暗黑2】【转载】

《暗黑破坏神2》&#xff0c;由顶尖游戏公司暴雪研发&#xff0c;2000 年上市&#xff0c;其资料片 2001 年上市&#xff0c;2D 画面。相信这款游戏已经成为很多人的回忆了&#xff0c;不知道当时是不是也和我一样沉迷于收集套装呢&#xff1f; 这款游戏的剧情设计、画面感都令…

js关闭当前窗口报错Scripts may close only the windows that were opened by them

文章目录 一、问题二、原因三、解决四、最后 一、问题 在Chrome浏览器中调用window.close()关闭当前页面时浏览器控制台报出 Scripts may close only the windows that were opened by them. 且无法关闭当前页面。 先上结论&#xff1a;不是通过JS打开的浏览器标签&#xff0c…

HTML--CSS--边框、列表、表格样式

边框样式 属性&#xff1a; border-width 边框宽度 border-style 边框外观 border-color 边框颜色 需要同时设定三个属性 border-width 边框宽度 取值为像素值 border-style 边框样式 none 无样式 dashed 虚线 solid 实线 border-color 边框颜色 如示例&#xff1a; 为div设…

知识点整理[(GraphGeo)RELATED WORK]

2 RELATED WORK 2.1 IP Geolocation 问题一:IP定位预测方法之一:Data mining-based methods 回答: 依赖于在公开的资源中挖掘位置线索来对目标IP(target IP)进行地理定位。其中一些数据分析了来自与IP相关的数据库,如WHOIS数据库和DNS的数据。 (1)例如,Moore等…

如何简单的使用文心一言(高级版)(中国版ChatGPT)

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的…

NLP论文阅读记录 - WOS | 2022 使用语言特征空间的抽象文本摘要的神经注意模型

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Neural A…

SMART PLC绝对值定位往复运动控制(脉冲绝对定位+状态机编程)

三菱FX3GA系列绝对定位指令DDRVA实现往复运动控制详细内容介绍请参考下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍SMART PLC里如何开启绝对值定位指…

前缀和模板题 P8218 【深进1.例1】求区间和

一道前缀和的模板题 #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; ll a[N],prefix[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m;cin >> n;for(int i 1; i < n; i) cin >> a[i]…

这可能是最全面的Java集合面试八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c…