当前位置: 首页 > news >正文

vue3 组件间通信的方式(setup语法糖写法)

vue3 组件间通信的方式(setup语法糖写法)

1. Props方式

该方式用于父传子,父组件以数据绑定的形式声明要传递的数据,子组件通过defineProps()方法创建props对象,即可拿到父组件传来的数据。

// 父组件
<template><div><son :msg="state.msg" /></div>
</template><script setup lang="ts">
import son from "./son.vue";
import { reactive } from "vue";
const state = reactive({msg: "父组件的值"
});
</script>
// 子组件
<template><div>{{ msg }}</div>
</template><script setup lang="ts">
const props = defineProps({msg: {type: String,default: ""}
});
</script>

2. emit方式

emit方式也是Vue中最常见的组件通信方式,该方式用于子传父。

// 父组件
<template><div><son @myClick="handleClick" /></div>
</template><script setup lang="ts">
import son from "./son.vue";
const handleClick = val => {console.log(val);
};
</script>
// 子组件
<template><div><button @click="handleClick">点击</button></div>
</template><script setup lang="ts">
const emit = defineEmits(["myClick"]);
const handleClick = () => {emit("myClick", "我是子组件的值");
};
</script>

3、defineExpose

利用defineExpose+ref 可以得到组件里的方法和变量

// 父组件
<template><div><son ref="sonRef" /><button @click="handleClick">点击</button></div>
</template><script setup lang="ts">
import son from "./son.vue";
import { ref } from "vue";
const sonRef = ref(null);
const handleClick = val => {console.log(sonRef.value.msg);
};
</script>
// 子组件
<template><div>son</div>
</template><script setup lang="ts">
defineExpose({msg: "我是子组件"
});
</script>

4. provide/inject 

provide/inject是 Vue 中提供的一对 API。无论层级多深,API 都可以实现父组件到子孙组件的数据传递。

// 父组件
<template><div><son /></div>
</template><script setup lang="ts">
import son from "./son.vue";
import { provide } from "vue";
provide("msg", "我是父组件");
</script>
// 子组件
<template><div>{{ data }}</div>
</template><script setup lang="ts">
import { inject } from "vue";
const data = inject("msg");
</script>

5、attrs

attrs可以接受除去 props、style、 class之外的属性。

// 父组件
<template><div><son :msg="state.msg" :hello="state.hello" /></div>
</template><script setup lang="ts">
import son from "./son.vue";
import { reactive } from "vue";
const state = reactive({msg: "我是父组件",hello: "hello"
});
</script>
// 子组件
<template><div>son</div>
</template><script setup lang="ts">
import { useAttrs } from "vue";
const attrs = useAttrs();
console.log(attrs.msg); // 我是父组件
</script>

6. v-model方式

v-model不能严格成为数据的传递方式,其实只是减少了代码量。

// 父组件
<template><div><son v-model:msg="state.msg" />{{ state.msg }}</div>
</template><script setup lang="ts">
import son from "./son.vue";
import { reactive } from "vue";
const state = reactive({msg: "我是父组件"
});
</script>

子组件需要emit一个叫update:xxx的事件,再把需要更新的响应式数据传给emit方法的第二个参数即可。

// 子组件
<template><div>son<button @click="handleClick">点击</button></div>
</template><script setup lang="ts">
const props = defineProps({msg: {type: String,default: ""}
});
console.log(props.msg);
// 子组件需要emit一个叫update:xxx的事件,再把需要更新的响应式数据传给emit方法的第二个参数即可
const emit = defineEmits(["msg"]);
const handleClick = () => {emit("update:msg", "我是子组件");
};
</script>

7. Vuex / Pinia

Vuex 和 Pinia 是 Vue 3 中的状态管理工具,使用这两个工具可以轻松实现组件通信,具体的使用方法可以查阅官方文档。

Vuex官方文档

Pinia官方文档

http://www.lryc.cn/news/94351.html

相关文章:

  • 【Cache】Rsync远程同步
  • Gitlab升级报错一:rails_migration[gitlab-rails] (gitlab::database_migrations line 51)
  • chatGPT流式回复是怎么实现的
  • 使用SpringEL获得字符串中的表达式运算结果
  • 力扣 39. 组合总和
  • 基于BES系列蓝牙耳机NTC充电电池保护电路设计
  • 13-C++算法笔记-递归
  • 从古代八卦探究计算机的八进制
  • Linux shell mkfs.ext4命令参数使用
  • 【Docker】子系统与其相关名词的界定、Control Groups等详细讲解
  • spring事务的传播性与隔离性
  • 【设计模式】模板方法与策略模式的结合使用
  • Jmeter实现参数加密
  • Solon Web 开发:四、认识请求上下文(Context)
  • docker安装RocketMQ(附填坑经验connect to <172.17.0.3:10909> failed)
  • GRU、LSTM、注意力机制(第八次组会)
  • 问题杂谈(三十六)@RequestBody、@RequestParam和@PathVariable三个注解的区别和使用
  • Flutter学习四:Flutter开发基础(六)调试Flutter应用
  • 新的开始(开始更新笔记)
  • 爬虫工具-替换js文件ReRes插件/Gores插件
  • 多任务学习用于多模态生物数据分析
  • 使用less命令搜索文件中的关键字
  • 【kubernetes系列】Kubernetes之Taints和tolerations
  • 宝剑锋从磨砺出 梅花香自苦寒来(高考志愿篇)
  • Jtti:怎样进行sql server2000 日志传送
  • MyBatis-Plus:条件构造器Wrapper
  • SNMP 计算机网络管理 实验1(二) 练习与使用Wireshark抓取SNMP数据包抓包之 任务三分析并验证TCP三次握手建立连接时三次握手工作过程
  • 【UE5 Cesium】03-Cesium for Unreal 添加本地数据集
  • 数通王国历险记之地址分析协议(ARP)
  • Mac端显示服务器上show的内容