多層組件的資料傳輸 - daniel-qa/Vue GitHub Wiki
- 父組件
// 提供接收名單数据和更新方法
const column3Items = ref([]);
provide("column3Items", column3Items);
- 子組件
const column3Items = inject("column3Items", ref([])); // 接收名單
因使用 ref 響應式,故子組件可以直接修改父組件變數,就會直接改變視圖。
// 記得要引用
import { ref, computed, onMounted, provide,inject } from "vue";
- 1 . 父子組件間資料傳遞:使用 props 和 emit 進行傳遞。
- 2 . 跨層級組件資料傳遞:使用 provide 和 inject 來提供和注入資料。
- 3 . 狀態管理:對於較大型應用,使用 Vuex 或 Pinia 來管理全局狀態,這樣可以跨越多層組件進行資料的共享與更新。
上述方法各有優缺,根據應用的規模選擇適合的解決方案。
provide, 可以提供變數,或 function 給子組件
最简单的方法是让子组件通过事件向父组件发送修改请求,父组件则通过方法来修改数据。
- 父组件(提供数据和修改方法)
// 提供数据给子组件
provide('message', message);
// 提供修改数据的方法给子组件
provide('updateMessage', (newMessage) => {
message.value = newMessage; // 修改父组件的 message
});
<!-- ParentComponent.vue -->
<template>
<div>
<p>父组件提供的数据: {{ message }}</p>
<ChildComponent />
</div>
</template>
<script setup>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
const message = ref('Hello from Parent'); // 使用 ref 创建响应式数据
// 提供数据给子组件
provide('message', message);
// 提供修改数据的方法给子组件
provide('updateMessage', (newMessage) => {
message.value = newMessage; // 修改父组件的 message
});
</script>
- 子组件(注入并修改数据)
const injectedMessage = inject('message'); // 注入父组件的数据
const updateMessage = inject('updateMessage'); // 注入父组件的修改方法
<!-- ChildComponent.vue -->
<template>
<div>
<p>子组件接收到的数据: {{ injectedMessage }}</p>
<el-button @click="changeMessage">修改消息</el-button>
</div>
</template>
<script setup>
import { inject } from 'vue';
const injectedMessage = inject('message'); // 注入父组件的数据
const updateMessage = inject('updateMessage'); // 注入父组件的修改方法
const changeMessage = () => {
if (updateMessage) {
updateMessage('New message from Child'); // 调用父组件的方法修改数据
}
};
</script>
- 1 . 父组件:提供数据
父组件提供一个数据项,子组件可以注入并使用它。
import { provide } from 'vue';
<!-- ParentComponent.vue -->
<template>
<div>
<p>父组件提供的数据: {{ message }}</p>
<ChildComponent />
</div>
</template>
<script setup>
import { provide } from 'vue';
import ChildComponent from './ChildComponent.vue';
const message = 'Hello from Parent'; // 父组件的数据
// 提供 message 数据给子组件
provide('message', message);
</script>
- 2 . 子组件:注入父组件的数据
子组件通过 inject 来获取父组件提供的数据,并在模板中使用它。
<!-- ChildComponent.vue -->
<template>
<div>
<p>子组件接收到的数据: {{ injectedMessage }}</p>
</div>
</template>
<script setup>
import { inject } from 'vue';
// 注入父组件提供的 message 数据
const injectedMessage = inject('message');
</script>
-
在 ParentComponent.vue 中,父组件使用 provide('message', message) 提供了一个数据项 message。
-
在 ChildComponent.vue 中,子组件使用 inject('message') 注入父组件提供的数据,并在模板中展示。