跳到主要内容

组件通信

父传子

父组件在子组件上传入属性,子组件通过 props 接收数据,也可以通过解构赋值的方式获取参数

function Child(props) {
return <h1>{props.num}</h1>;
}

export default function Father() {
return <Child num={123} />;
}

当传递的数据只有属性名没有值,那么就是传递了一个布尔值 true

function Child({ num, isShow }) {
return (
<>
<h1>{num}</h1>
{isShow + ''}
</>
);
}

export default function Father() {
return <Child num={123} isShow />;
}

子传父

子组件调用父组件的方法,修改父组件的内容,永远都是父组件自己在修改自己,子组件只是通知父组件

import { useState } from 'react';

function Child(props) {
return (
<>
<h1>{props.num}</h1>
<button onClick={() => props.changeNum(666)}>change</button>
</>
);
}

export default function App() {
const [msg, setMsg] = useState('你好');

// 这里的 arg 就是接收子组件传过来的值
const numChange = (arg) => {
console.log(arg);
setMsg(arg);
};

return (
<>
<h1>{msg}</h1>
<Child num={123} changeNum={numChange} />
</>
);
}

在父组件里也可以直接把 setMsg 方法传给子组件,避免多声明一个函数

// 父组件
<Child num={123} setMsg={setMsg} />

// 子组件
<button onClick={() => props.setMsg(666)}>change</button>

批量传参

如果父组件要传递多个参数给子组件,可以写在一个对象里

父组件:

import Child from './Child';

function App() {
const info = {
num: 123,
isShow: true,
onMsg(e) {
console.log(e);
}
};

return (
<>
<Child {...info} />
</>
);
}

export default App;

子组件:

function Child({ num, isShow, onMsg }) {
return (
<>
<h1>{num}</h1>
{isShow + ''}
<button onClick={() => onMsg(num)}>click</button>
</>
);
}

export default Child;

通信总结

简单理解,把父子组件看成两个函数,子组件接收的 props 就是一个函数参数,父组件可以把它的 state 作为 props 向下传递到它的子组件中,这样在子组件里就能接收父组件的数据。

子组件如何向父组件传值呢?父组件将一个函数传给子组件,子组件调用这个函数,将自己的数据当作参数传递给该函数,那么父组件就能接收子组件的数据了,其实就是闭包

function f1() {
const num = 0;
const fn = (msg) => {
console.log(msg);
};
const props = { num, fn };

f2(props);
}

function f2(props) {
const num = 1;
props.fn(num + props.num);
}

f1();