在前端开发中,组件化是一种常见的开发模式,它可以将复杂的用户界面拆分成多个可重用的组件。在Vue和React中,组件之间的数据和事件传递是非常关键的,其中父传子和子传父是常见的通信方式。本文将介绍在Vue和React中分别如何实现父传子和子传父的组件通信。
一、Vue中的组件通信
1. 父传子
在Vue中,父组件通过props属性向子组件传递数据。父组件使用v-bind
指令绑定数据到子组件的props上,子组件则通过props接收这些数据并在内部使用。
示例代码:
javascript
// 父组件
<template>
<div>
<ChildComponent :message="message" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
data() {
return {
message: 'Hello Vue!'
};
},
components: {
ChildComponent
}
};
</script>
// 子组件
<template>
<div>
{{ message }}
</div>
</template>
<script>
export default {
props: ['message']
};
</script>
2. 子传父:
在Vue中,子组件通过$emit
方法触发自定义事件,并将需要传递给父组件的数据作为参数。父组件可以在子组件标签上监听这些自定义事件,并在对应的方法中处理数据。
示例代码:
javascript
// 子组件
<template>
<div>
<button @click="handleClick">点击按钮</button>
</div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$emit('custom-event', 'Hello Parent!');
}
}
};
</script>
// 父组件
<template>
<div>
<ChildComponent @custom-event="handleCustomEvent" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
methods: {
handleCustomEvent(data) {
console.log(data); // 输出:Hello Parent!
}
},
components: {
ChildComponent
}
};
</script>
二、React中的组件通信
1. 父传子
在React中,父组件通过将属性传递给子组件来实现父传子。父组件将数据作为属性传递给子组件,在子组件中通过this.props
访问这些属性。
示例代码:
javascript
// 父组件
import React from 'react';
import ChildComponent from './ChildComponent';
class ParentComponent extends React.Component {
render() {
return (
<div>
<ChildComponent message="Hello React!" />
</div>
);
}
}
// 子组件
import React from 'react';
class ChildComponent extends React.Component {
render() {
return (
<div>
{this.props.message}
</div>
);
}
}
2. 子传父
在React中,子组件通过调用父组件传递的方法并传递需要传递给父组件的数据来实现子传父。父组件将一个方法作为属性传递给子组件,在子组件中通过调用这个方法并传递参数来触发父组件中对应的处理函数。
示例代码:
javascript
// 子组件
import React from 'react';
class ChildComponent extends React.Component {
handleClick() {
this.props.onChildClick('Hello Parent!');
}
render() {
return (
<div>
<button onClick={this.handleClick.bind(this)}>点击按钮</button>
</div>
);
}
}
// 父组件
import React from 'react';
import ChildComponent from './ChildComponent';
class ParentComponent extends React.Component {
handle子事件(data) {
console.log(data); // 输出:Hello Parent!
}
render() {
return (
<div>
<ChildComponent onChildClick={this.handleChildEvent.bind(this)} />
</div>
);
}
}
// 渲染组件
ReactDOM.render(<ParentComponent />, document.getElementById('root'));
三、小程序中的组件通信
1. 父传子
在小程序中,父组件通过在wxml中使用属性来传递数据给子组件。父组件可以在子组件的标签上设置属性,然后子组件可以通过this.properties
接收这些属性。
示例代码:
javascript
// 父组件
// parent.wxml
<view>
<child-component message="{{message}}" />
</view>
// parent.js
Page({
data: {
message: 'Hello Mini Program!'
}
});
// 子组件
// child-component.wxml
<view>
{{ message }}
</view>
// child-component.js
Component({
properties: {
message: String
}
});
2. 子传父
在小程序中,子组件通过触发父组件绑定的自定义事件,并将需要传递给父组件的数据作为参数来实现子传父。父组件可以在子组件标签上监听这些自定义事件,并在对应的方法中处理数据。
示例代码:
javascript
// 子组件
// child-component.wxml
<view>
<button bindtap="handleClick">点击按钮</button>
</view>
// child-component.js
Component({
methods: {
handleClick() {
this.triggerEvent('customEvent', { data: 'Hello Parent!' });
}
}
});
// 父组件
// parent.wxml
<view>
<child-component bind:customEvent="handleCustomEvent" />
</view>
// parent.js
Page({
handleCustomEvent(event) {
console.log(event.detail.data); // 输出:Hello Parent!
}
});
注意:小程序需要在pages 文件夹下index 页面 (记住是页面)中引入这个组件,引入的时候路径 就不需要在写 index.js 因为文件的默认查找就是 index.js
index.json :
javascript
{
"componet": true, //开启子组件使用
"usingComponents": {
"componentA": "../../component/header" //定义子组件名字并引入子组件
}
}