【问题标题】:Update all react children components更新所有反应子组件
【发布时间】:2019-04-27 08:12:23
【问题描述】:

我有这样的代码:

<Editor source="/api/customer" onCreate={this.debugChange} onDelete={this.debugChange} onUpdate={this.debugChange}>
    <Group title="Address">
        <Column id="id" label="ID" default={0} readonly />
        <Column id="name" label="name" default="" />
        <Column id="address" label="Address" default="" />
        <Column id="country" label="Country" default={currentCountry} readonly source="/api/country" idfield="id" captionField="name" />
    </Group>
    <Group title="Payment">
        <Column id="tax" label="TaxType" default={0} source="/api/taxtype" idfield="id" captionField="name" />
        <Column id="bank" label="Bank" default="" source="/api/banks" idfield="id" captionField="bank"/>
        <Column id="account" label="Account Number" default="" />
    </Group>
</Editor>

Editor 有一个这样的render() 函数:

    let components = React.Children.map(this.props.children, (child) => {
        return <Column {...child.props} default={row[child.props.id]} onChange={this.onChange.bind(this)} />
    })

    return <div className="hx-editor">
        <div className="hx-editor-list">
            <List id={this.props.id + "-list"} source={this.props.source}
                singleShow captionField={this.caption.bind(this)}
                groupfn={this.props.group} onSelect={this.onSelect.bind(this)} />
        </div>
        <form name={"hx-form-" + this.props.id} className="hx-form">
            {components}
            {buttons}
        </form>
    </div >

我在&lt;List&gt;onSelect有这样的功能

private onSelect(id: string, data: T) {
    this.setState({
        currentRow: data,
        modifiedRow: data
    })
}

&lt;Editor&gt; 将显示来自/api/customer&lt;List&gt; 的列表,并将选定的值发送到onSelect 道具,进而更新所有&lt;Column&gt; 孩子。数据对应column的id,如:

data = [{
    id: 0,
    name: 'My Customer',
    address: 'This is Address',
    country: 'US',
    tax: '010',
    bank: 'HSBC',
    account:: '89238882839304'
}, ... ]

我放在这里的这个方法,只对&lt;Editor&gt;下的孩子有效,在&lt;Group&gt;下无效。

我的问题是,当用户单击&lt;List&gt; 中的值时,如何将&lt;Column&gt; 的所有值作为&lt;Editor&gt; 的子项进行深度更新。我的意思是,对所有子节点执行&lt;Column&gt; 搜索,并更新所有值,无论它们在哪里,只要在&lt;Editor&gt; 标记内。

感谢任何帮助。谢谢

【问题讨论】:

  • &lt;Group /&gt; 没有任何变化 - 没有理由重新渲染
  • 我想改变里面的

标签: reactjs typescript3.0


【解决方案1】:

好的...这会破坏 Typescript,我不知道如何在 Typescript 中正确输入,但是这个可以。

private deepColumn(children: React.ReactNode) => any) {
    return React.Children.map(children, child => {
        if (child.props.children) {
            child = React.cloneElement(child, {
                children: this.deepColumn(child.props.children)
            })
        }
        if (child.type.name == "Column") {
            return <Column {...child.props} default={this.default} onChange={this.onChange.bind(this)} />
        } else return child;
    })
}

【讨论】:

    【解决方案2】:

    &lt;Group /&gt; 作为中间“层”将“阻止更改传播”-此组件不“消耗”任何道具,因此不了解更改。

    你可以/需要:

    • 改变结构;
    • 传递将被更改的道具(并将强制在孩子中更新);
    • 使用redux;
    • 使用上下文 API。

    【讨论】:

    • 嗯,它本身不是&lt;Group /&gt;,因为&lt;Editor /&gt; 中的任何内容都将由编辑器管理其&lt;Column /&gt; 值。因此,它可以在任何组件中,例如 &lt;Tab /&gt;&lt;Panel /&gt; 或任何 UI 布局组件或额外组件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2021-08-07
    • 2020-03-13
    • 2017-09-10
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多