Skip to content

props

什么是 props

props 是 React 中提供的将数据从父组件传递到子组件的机制,是父子组件通信的一种方式。

在 React 中 props 是只读的,子组件不能修改 props,以保证数据的单向流动。

基本用法

在父组件中,通过在子组件标签上添加属性的方式传递数据。

在子组件中,通过 props 对象获取父组件传递的数据。

tsx
function Person(props: { name: string; age: number; gender: string }) {
    return (
        <div>
            <h2>Name: {props.name}</h2>
            <h2>Age: {props.age}</h2>
            <h2>Gender: {props.gender}</h2>
        </div>
    );
}

export default function PropsBasic() {
    return (
        <>
            <Person name="John" age={25} gender="male" />
        </>
    );
}

解构赋值

在子组件中,可以使用解构赋值的方式获取 props 中的数据。

tsx
function Person({ name, age }: { name: string; age: number }) {
    return (
        <div>
            <h2>Name: {name}</h2>
            <h2>Age: {age}</h2>
        </div>
    );
}

export default function PropsDeconstruct() {
    return <Person name="Tom" age={30} />;
}

传递函数

除了传递数据,还可以通过 props 传递函数,实现父子组件之间的通信。

tsx
import { useState } from "react";

function CountButton(props: {
    count: number;
    setCount: (count: number) => void;
}) {
    return (
        <button onClick={() => props.setCount(props.count + 1)}>
            Click Add Count: {props.count}
        </button>
    );
}

export default function PropsFn() {
    const [count, setCount] = useState(0);

    return (
        <>
            <CountButton count={count} setCount={setCount} />
        </>
    );
}

剩余参数

在子组件中,可以使用剩余参数的方式获取除了指定的 props 之外的其他 props。

tsx
function Person({ name, ...props }: { name: string; [key: string]: any }) {
    return (
        <div>
            <h2>Name: {name}</h2>
            {props.age && <h2>Age: {props.age}</h2>}
            {props.gender && <h2>Gender: {props.gender}</h2>}
            {props.email && <h2>Email: {props.email}</h2>}
        </div>
    );
}

export default function PropsRest() {
    return <Person name="John" age={18} gender="male" />;
}

默认值

在子组件中,可以给 props 设置默认值,当父组件没有传递该 props 时,使用默认值。

tsx
function Person({ name, age = 18 }: { name: string; age?: number }) {
    return (
        <div>
            <h2>Name: {name}</h2>
            <h2>Age: {age}</h2>
        </div>
    );
}

export default function PropsDefault() {
    return <Person name="John" />;
}