何时在 Preact 子组件中使用 Props 以及何时使用 State

When to use Props and when State in Preact sub components

我正在学习 preact,但这也可能与 React 有关。

假设我有一个复选框列表,每个复选框都有一些额外的 HTML,像这样 (Typescript):

export class MyCheckbox extends Component<Props, State> {

    render(props, state) {
        return (
            <div>
                <input
                    type="checkbox"
                    checked={state.checked}
                    onChange={props.onUpdate}
                    />
                <div>
                    {props.name}
                    <!-- other GUI elements -->
                </div>
            </div>
        );
    }
}

然后,这些组件在更高级别的组件中使用,如下所示:

render(props, state) {

    return (
        <div class={style.finding}>
            <form>
                { this.elements
                    .map(el => (
                        <MyCheckbox name={el.name} checked={el.checked} onUpdate={this.onUpdate()} />
                    ))
                }
            </form>
        </div>        
    </div>
);

如您所见,更高级别的组件告诉复选框是否应该选中它。所以checkbox的Props对象上面有一个属性checked,决定checkbox可见时是否要勾选

但是,我们还需要 State 上的 checked 属性,因为用户可能会单击复选框并因此更新它。所以 Props.checked 表示 "initially checked" 而 State.checked 表示 "currently checked".

但是如果用户单击复选框,onUpdate 方法将更新更高级别组件上的 this.elements 模型。这将在更高级别的组件上触发 render(),后者又将新的 Props.checked 传递给复选框。

这意味着,复选框的 Props 将像一个状态一样起作用。当用户单击复选框时它会更新,然后新状态将传递给复选框。

这正常吗?还是我的设计有问题?子组件是否需要状态?

通常的方法是应用有状态parent和无状态child模式。

在您的情况下 MyCheckbox 应该是无状态的(不应包含 checked 状态变量)并且选中的值应该是 属性.

检查值的状态应该由parent状态处理。

export class MyCheckbox extends Component<Props, State> {
    render(props, state) {
        return (
            <div>
                <input
                    type="checkbox"
                    checked={props.checked}
                    onChange={props.onUpdate} />
                <div>
                    {props.name}
                    <!-- other GUI elements -->
                </div>
            </div>
        );
    }
}

parent:

export class Parent extends Component<Props, State> {
    ...
    render(props, state) {
        return (
            <div class={style.finding}>
                <form>
                    { this.elements
                        .map(el => (
                            <MyCheckbox name={el.name} checked={this.isChecked(el)} onUpdate={this.onUpdate()} />
                        ))
                    }
                </form>
            </div>        
        </div>
    );

    isChecked(elem) {
        // use this.state to verify to return a boolean representing the checkbox checked state
    }
}

使组件无状态总是好的。拥有表示组件相同方面的 prop 和 state 值有点难看。

希望对您有所帮助