【Vue3】组件间通信
props
父组件向子组件传递数据可以通过 props
。
<!-- 父组件TodoList.vue -->
<template>
<todo-item
v-for="todo in todos"
:key="todo.id"
:title="todo.title"
></todo-item>
</template>
<script>
import TodoItem from '@/components/TodoItem.vue'
export default {
name: 'TodoList',
components: {
TodoItem
},
setup() {
let todos = reactive(
{id:1, title:eat},
{id:2, title:sleep}
)
return {
todos
}
}
}
</script>
<!-- 子组件TodoItem.vue -->
<template>
<span>{{todo.title}}</span>
<button></button>
</template>
<script>
export default {
name: 'TodoItem',
props: ['todo']
}
</script>
emit
子组件传递数据给父组件
<!-- Parent.vue -->
<template>
<Child @myClick="myClick"/>
</template>
<script>
// @ is an alias to /src
import Child from '@/components/Child.vue'
export default {
name: 'Parent',
components: {
Child
},
setup() {
const myClick = (value) => console.log(value)
return {
myClick
}
}
}
</script>
<!-- Child.vue -->
<template>
<button @click="toParent">click</button>
</template>
<script>
export default {
name: 'Child',
setup(props,{emit}) {
const toParent = () => emit('myClick','come from child')
return {
toParent
}
}
}
</script>
Provide / Inject
当父组件向子孙组件传递数据时可以使用一对provide
和inject
。
父组件有一个provide
选项来提供数据,子组件有一个inject
选项来开始使用这些数据。
语法:
provide(name, value) //property名,property值
inject(name, default) //property名,默认值
举例:
<!-- Parent.vue -->
<template>
<Child />
</template>
<script>
import Child from './Child.vue'
import { provide, reactive, ref, readonly } from 'vue' //导入provide
export default {
name: 'Parent',
components: {
Child
},
setup() {
const location = ref('North Pole')
const geolocation = reactive({
longitude: 90,
latitude: 135
})
const updateLocation = () => {
location.value = 'South Pole'
}
provide('location', readonly(location)) //提供只读property
provide('geolocation', geolocation) //提供了一个响应式property
provide('updateLocation', updateLocation) //提供了一个方法
}
}
</script>
<!-- Child.vue -->
<template>
<GrandChild />
</template>
<script>
import GrandChild from './GrandChild.vue'
export default {
name: 'Child',
components: {
GrandChild
}
}
</script>
<!-- GrandChild.vue -->
<script>
import { inject } from 'vue' //导入inject
export default {
name: 'GrandChild',
setup() {
const userLocation = inject('location', 'The Universe') //注入property
const userGeolocation = inject('geolocation') //注入property
const updateUserLocation = inject('updateLocation') //注入方法
return {
userLocation,
userGeolocation,
updateUserLocation
}
}
}
</script>
Vuex
多组件间通信可以通过 Vuex
具体可看官方文档
本文来自博客园,作者:hzyuan,转载请注明原文链接:https://www.cnblogs.com/hzyuan/p/16021187.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)