【Vue】组件传参

这里写目录标题

  • 一、props:父组件向子组件传递数据(常用)
  • 二、$emit:子组件向父组件传递数据(常用)
  • 三、vuex:状态管理,实现多个组件进行数据共享(常用,重点)
  • 四、eventBus:常用于多层嵌套组件场景下兄弟组件或任意两个组件之间通讯(事件总线)
  • 五、ref:通过$refs可以拿到子组件的实例,从而调用实例里的方法来实现父子组件通信
  • 六、provide / inject:通过依赖注入(inject / provide)的方式,向其所有子孙后代传递数据
  • 七、attrs/listeners
  • 八、$children / $parent

一、props:父组件向子组件传递数据(常用)

缺点:若组件嵌套层次多,传递数据比较麻烦

  • 父组件
  <template><child :message="message"></child></template><script>import Child from './Child.vue'export default {components: {Child},data() {return {message: '父组件'}}}</script>
  • 子组件Child
  <template><div><span>{{message}}</span></div></template><script>export default {props: {message: {type: String,default: '子组件'}}}</script>

二、$emit:子组件向父组件传递数据(常用)

  • 父组件
<template><child :num="num" @addCount="addCount"></child>
</template>
<script>
import Child from "./Child.vue";
export default {components: {Child},data() {return {num: 100};},methods: {addCount(res) {//将子组件传来的参数复制给numthis.num = res;}}
};
</script>
  • 子组件Child
<template><div><el-button type="primary" @click="addCount">{{ count++ }}</el-button></div>
</template>
<script>
export default {props: {num: {type: Number,default: 0}},data() {return {num: 100};},methods: {addCount() {//将num传给父组件this.$emit("addCount", this.num + 1);}}
};
</script>

三、vuex:状态管理,实现多个组件进行数据共享(常用,重点)

  • store.js
import Vuex from "vuex";
import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex);
const store = new Vuex.Store({state: {//基本数据,用来存储变量。count: 0,list: [{ id: 1, is: false },{ id: 2, is: true }]},getter: {//Getter类似于Vue的computed对象。是根据业务逻辑来处理State,使得生成业务所需的属性。listFilter: (state, getters) => {return state.list.filter(res => res.is);}},mutations: {//更改vuex的store中的状态的唯一方法,只能是同步操作。increment(state, payload) {state.count += payload;}},actions: {//Action 提交的是 mutation,而不是直接变更状态;//Action 可以包含任意异步操作。addCount({ commit }) {// context ({ dispatch, commit })是一个与 store 实例具有相同方法和属性的 context 对象setTimeout(() => {commit("increment");}, 1000);}//Action处理异步的正确使用方式// async actionA({ commit }) {//  commit('gotData', await a())// },// async actionB({ dispatch, commit }) {//   await dispatch('actionA') // 等待 actionA 完成//   commit('gotOtherData', await b())// }},module: {//模块化,module可以将store 分割成模块,每个模块中拥有自己的 state、mutation、action 和 getter},//持久化plugins: [createPersistedState()],
});
  • 将store注入到根实例
// 注入到根实例-入口文件
new Vue({el: '#app',store,template: '<App/>',components: { App }
})
  • 组件A
<template><div><el-button type="primary" @click="addCount"></el-button></div>
</template>
<script>
import { mapMutations, mapActions } from "vuex";
export default {// 原始写法// methods: {//     //改变状态count//     addCount() {//       this.$store.commit("increment", 5);//       this.$store.dispatch({//         type: "incrementAsync"//       });//     }//   }// };//mapMutations 辅助函数 获取
//mapActions 辅助函数 获取methods: {//方式1// ...mapMutations(["increment"]),//方式2...mapMutations({// userInfo 是一个重新定义的别名,本组件可以直接调用这个方法名字使用increment1: "increment",}),//mapActions写法同mapMutation...mapActions(["incrementAsync"]),//改变状态countaddCount() {this.increment1(5);// 以对象形式分发Actionthis.incrementAsync(5);},},
};
</script>
  • 组件B
<template><div>{{ count }}{{ listFilter }}</div>
</template>
<script>
import { mapState, mapGetters } from "vuex";
export default {// 原始写法// computed: {//   count() {//     // 获取vuex里的count//     return this.$store.state.count;//   },//   listFilter() {//     // 获取vuex里的listFilter//     return this.$store.getters.listFilter;//   },// }//mapState 辅助函数 获取//mapGetters 辅助函数 获取computed: {// 注意:这种写法用mapstate等这种辅助函数的时候,前面的方法名和获取的属性名是一致的...mapState(["count"]),...mapGetters(["listFilter"]),},
};
</script>
  • 模块化:将 store 分割为模块(module),每个模块拥有自己的 state 、 getters 、mutations 、actions 。(开发常用)

四、eventBus:常用于多层嵌套组件场景下兄弟组件或任意两个组件之间通讯(事件总线)

缺点:不支持响应式, $on事件不会自动清楚销毁的,需要手动来销毁,可在beforeDestroy中解绑监听,避免重复触发。

  • 入口文件添加事件总线
import Vue from 'vue';
// 添加事件总线
Vue.prototype.$eventBus = new Vue();
  • 组件A
<template><div>{{ a }}</div>
</template><script>
export default {data() {return {a: "",};},create() {this.$eventBus.$on("message", (res) => {//组件b传过来的参数this.a = res;console.log("收到消息!");});},// 组件销毁时需要解绑监听beforeDestroy() {eventBus.$off("message");},
};
</script>
  • 组件B
<template><div><span>{{a}}<span></div></template><script>export default {data() {return {a: '兄弟组件'};},create() {this.eventBus.$emit('message',a)}};</script>

五、ref:通过$refs可以拿到子组件的实例,从而调用实例里的方法来实现父子组件通信

  • 父组件
<template><el-button type="primary" @click="get">通过ref获取子组件实例</el-button>哦那个子组件获取的: {{ num }}<child ref="child"></child>
</template>
<script>
import Child from "./Child.vue";
export default {components: {Child},data() {return {num: 100};},methods: {get() {this.num = this.$refs.child.num;}}
};
</script>
  • 子组件Child
<template><div><el-button type="primary" @click="addCount">{{ num }}</el-button></div>
</template>
<script>
export default {data() {return {num: 100};},methods: {addCount() {this.num++;}}
};
</script>

待补充

六、provide / inject:通过依赖注入(inject / provide)的方式,向其所有子孙后代传递数据

缺点:无法监听数据修改的来源,不支持响应式。

  • 父组件
<template><el-button type="primary" @click="get">通过ref获取子组件实例</el-button>哦那个子组件获取的: {{ num }}<child ref="child"></child>
</template>
<script>
import Child from "./Child.vue";
export default {components: {Child},// 提示:provide 和 inject 绑定不支持响应式。provide() {return {// 传过去的必须是可监听的对象,注意,是对象,其他类型都不行user: this.userInfo};},data() {return {userInfo: {id: "1"}};},methods: {get() {this.userInfo.name= "小明";}}
};
</script>
  • 子组件Child
<template><div>{{ user.name}}</div>
</template>
<script>
export default {inject: ["foo"]
};
</script>

七、attrs/listeners

自行查阅资料

八、$children / $parent

自行查阅资料

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

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

相关文章

Linux系统Shell脚本-----------正则表达式 、grep、 sed

一、正则表达式 1.前言 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板&…

vue实现跳转传参查询

vue实现跳转传参查询&#xff1a; 应用场景&#xff1a;外部链接携参跳转目标页时,避免多次输入查询信息查询 目标需求&#xff1a;登录及非登录状态均可跳转自动查询 避坑指南&#xff1a;token失效时需要重新缓存及路由导航缓存判断 简单实现&#xff1a;缓存信息&#xff0c…

LLM之makeMoE:makeMoE的简介、安装和使用方法、案例应用之详细攻略

LLM之makeMoE&#xff1a;makeMoE的简介、安装和使用方法、案例应用之详细攻略 目录 makeMoE的简介 1、对比makemore 2、相关代码文件 makMoE_from_Scratch.ipynb文件 makeMoE_Concise.ipynb文件 makeMoE的安装和使用方法 1、基于Databricks使用单个A100进行开发 makeM…

消息队列和Kafka

消息队列&#xff08;类似于蜂巢柜的功能&#xff09;&#xff1a;异步操作 特点&#xff1a;低耦合&#xff0c;响应时间快&#xff0c;异步削峰限流&#xff08;在不繁忙的时间段处理再处理任务&#xff09;&#xff0c;系统结构弹性大&#xff0c;易于扩展 kafka Kafka的主…

线程锁多线程的复习

线程 实现方式3种乐观锁&悲观锁线程池线程池总结 进程:是正在运行的程序 线程:是进程中的单个顺序控制流,是一条执行路径 实现方式3种 1.Thread //步骤一:定义一个继承Thread的类 //步骤二:再定义的类中重写run()方法 //步骤三:创建定义类对象 //步骤四:启动线程 class M…

webpack环境配置

1.首先安装 cross-env npm install cross-env --save-dev 在package.json里面配置 根据不同命令打包 "scripts": {"dev": "cross-env NODE_ENVdevelopment webpack-dev-server --config webpack.config.dev.js","dev:test": "c…

Armv8-M的TrustZone技术之在安全状态和非安全状态之间切换

Armv8-M安全扩展允许在安全和非安全软件之间直接调用。 Armv8-M处理器提供了几条指令来处理状态转换: 下图显示了安全状态转换。 如果入口点的第一条指令是SG且位于非安全可调用内存位置中,则允许从非安全到安全软件的直接API函数调用。 当非安全程序调用安全API时,API通过…

CSS的flex弹性布局

<!DOCTYPE html> <html> <head> <meta charset"UTF-8" /> <title>flex弹性布局</title> <style> /* 加了flex是弹性容器 */ .box{ display: flex; height: 300px; /* justify-content: start; 默认情况 */ /* justify-c…

vue中的vuex

在Windows的应用程序开发中&#xff0c;我们习惯了变量&#xff08;对象&#xff09;声明和使用方式&#xff0c;就是有全局和局部之分&#xff0c;定义好了全局变量&#xff08;对象&#xff09;以后在其他窗体中就可以使用&#xff0c;但是窗体之间的变量&#xff08;对象&am…

20240129收获

今天终于发现《八部金刚功》第五部我一直做的是错的&#xff0c;嗨。这里这个写法非常聪明&#xff0c;创立的数组&#xff0c;以及用obj[key] item[key]这样的写法&#xff0c;这个写法充分展示了js常规写法中只有等号右边会去参与运算&#xff0c;等号左边就是普通的键的写法…

项目实现网页分享QQ空间功能

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供“点击转发按钮&#x…

TensorFlow2实战-系列教程9:RNN文本分类1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、文本分类任务 1.1 文本分类 数据集构建&#xff1a;影评数据集进行情感分析&…

笔记 | Clickhouse 命令行连接及查询

在 ClickHouse 中&#xff0c;可以使用命令行客户端执行查询。默认情况下&#xff0c;ClickHouse 的命令行客户端称为 clickhouse-client。下面是一些基本的步骤和示例&#xff0c;用于使用 clickhouse-client 进行查询。 首先&#xff0c;需要确保已经安装了 ClickHouse 服务…

Hana SQL+正则表达式

目录 一、Pre 前言 二、知识点拆解 1&#xff09;case when…then…else 2&#xff09;json_value 函数 拓展资料 3&#xff09;CAST 函数 拓展资料 4) ROUND 函数 5&#xff09;occurences_regexpr 函数 拓展资料 6&#xff09;正则表达式 拓展资料 三、整合分析…

代码随想录算法训练营第三十天|860.柠檬水找零 , 406.根据身高重建队列, 452. 用最少数量的箭引爆气球

60.柠檬水找零 代码随想录 情况一&#xff1a;账单是5&#xff0c;直接收下。 情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10 情况三&#xff1a;账单是20&#xff0c;优先消耗一个10和一个5&#xff0c;如果不够&#xff0c;再消耗三个5 所…

10s 内得到一个干净、开箱即用的 Linux 系统

安装 使用官方脚本安装我的服务器不行 官方脚本 mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) 下面是我的完整安装过程 mkdir /opt/instantbox cd /opt/instantbox 1.脚本文件 (这个没…

[PHP]严格类型

PHP: 类型声明 - Manual

【学网攻】 第(15)节 -- 标准ACL访问控制列表

系列文章目录 目录 系列文章目录 文章目录 前言 一、ACL(访问控制列表)是什么? 二、实验 1.引入 实验拓扑图 实验配置 测试PC2能否Ping通PC3 配置ACL访问控制 实验验证 PC1 Ping PC3 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认…

python 循环解压 解压多重压缩包

在实际数据中&#xff0c;经常会有压缩包套压缩包的情况&#xff0c;并且有可能出现“zip”压缩包下面套“tar”的可能。 你可以运行后面的代码&#xff0c;来完成自动解压。代码会不断检查folder_a_path 文件夹下是否还有压缩包。目前支持zip、rar、tar、7z等四种格式的压缩文…

@EnableEurekaServer

定义&#xff1a;EnableEurekaServer注解是Spring Cloud中的一个注解&#xff0c;用于将Spring Boot应用程序指定为Eureka服务器。 Eureka服务器是一个服务注册中心&#xff0c;也被称为发现服务器&#xff0c;管理和协调微服务。保存有关所有客户端服务应用程序的信息。 每个…