抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

概述

无论是在 Angular,还是在 Vue,组件传输数据都是一个重要的功能。组件之间传输数据的方式有很多种,本文主要介绍在 uni-app 中常用的几种方式。

在 angular 里面,我大概知道存在有 3 种方式进行组件之间的数据传输:

  1. @Input () 和 @Output ():通过输入属性和输出事件来实现父子组件之间的数据传输。
  2. 服务(Service):通过共享服务来实现跨组件的数据共享。
  3. 状态管理(如 NgRx):通过全局状态管理来实现组件之间的状态共享。

在 uni-app 中,我们也可以借鉴这些思路来实现组件之间的数据传输。

父子组件传值

父子组件传值是最常见的组件通信方式。父组件通过 props 向子组件传递数据,子组件通过事件向父组件传递数据。

父组件向子组件传值

父组件通过 props 向子组件传递数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- ParentComponent.vue -->
<template>
<view>
<ChildComponent :message="parentMessage" />
</view>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
parentMessage: 'Hello from Parent'
};
}
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- ChildComponent.vue -->
<template>
<view>
<text>{{ message }}</text>
</view>
</template>

<script>
export default {
props: {
message: String
}
};
</script>

子组件向父组件传值

子组件通过事件向父组件传递数据。它是使用 this.$emit 方法来触发一个事件,父组件通过监听这个事件来接收数据。

this.$emit(a, b); 中的 a 是什么,父组件中的 @a 就是什么,b 是什么,父组件中的回调函数的第一个参数就是什么。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- ParentComponent.vue -->
<template>
<view>
<ChildComponent @childEvent="handleChildEvent" />
<text>{{ childMessage }}</text>
</view>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
childMessage: ''
};
},
methods: {
handleChildEvent(message) {
this.childMessage = message;
}
}
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- ChildComponent.vue -->
<template>
<view>
<button @click="sendMessageToParent">Send Message to Parent</button>
</view>
</template>

<script>
export default {
methods: {
sendMessageToParent() {
this.$emit('childEvent', 'Hello from Child');
}
}
};
</script>

兄弟组件传值

兄弟组件是指在同一个父组件中引用的两个或多个子组件。它们之间不能直接通过 props 或事件进行通信。我们可以通过一个共享的 “Service” 或 “Store” 模块来解决。

通过共享的 Store (类似 Service)

我们可以创建一个共享的 Store 模块,来存储和管理兄弟组件之间共享的数据。

1
2
3
4
5
6
7
8
9
// store.js
import Vue from 'vue';
export const store = Vue.observable({
sharedMessage: ''
});

export const setSharedMessage = (message) => {
store.sharedMessage = message;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- SiblingComponentA.vue -->
<template>
<view>
<input v-model="message" placeholder="Enter message" />
<button @click="sendMessage">Send to Sibling B</button>
</view>
</template>

<script>
import { setSharedMessage } from './store.js';
export default {
data() {
return {
message: ''
};
},
methods: {
sendMessage() {
setSharedMessage(this.message);
}
}
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- SiblingComponentB.vue -->
<template>
<view>
<text>Message from Sibling A: {{ sharedMessage }}</text>
</view>
</template>

<script>
import { store } from './store.js';
export default {
computed: {
sharedMessage() {
return store.sharedMessage;
}
}
};
</script>