由ref

时间:2018-07-25 11:26:55

标签: reactjs typescript tsx react-tsx

我正在尝试渲染一个有两个孩子的父组件。子代的渲染将切换,因此一次将仅渲染第一个子代,另一次将是最后一个子代,最后将切换回第一个子代(然后应包含之前显示的所有值)。 我以为这很简单,但事实并非如此。

现在出现问题:每当调用switchContainer方法时,它将切换容器并渲染另一个。但是,所有成员变量,道具和状态都已丢失,并且基本上从零开始重新确定了子组件。

是否有一种方法可以按原样保存子组件,并且一旦重新渲染子组件,它将再次保留所有成员变量,道具和状态?

我知道您可以向以下元素发送道具和状态:

<Child props={<data>} states={<data>}>

但这不能解决缺少成员变量的问题,我认为这不是一个平滑的解决方案。

到目前为止,我的尝试是(这只是一个模型):

class Parent extends React.Component<any,any> {
  private firstContainer:any;
  private secondContainer:any;
  private currentContainer:any;
  constructor(props:any) {
        super(props);
        this.firstContainer = <Child>;
        this.secondContainer = <Child>;
    }
    public render() {
        return (
            <div>
                {this.currentContainer}
            </div>
        );
    }
    public switchContainer() {
        if(this.currentContainer === this.firstContainer) {
            this.currentContainer = this.secondContainer;
        }
        else {
            this.currentContainer = this.firstContainer;
        }
        this.forceUpdate();
    }
}


class Child extends React.Component<any,any> {
    private anyValue:string;
    constructor(props) {
        this.change = this.change.bind(this);
    }
    public render() {
        return (
            <input onChange={this.change} value={this.anyValue}/>
        );
    }
    private change(e:any) {
        this.anyValue = e.target.value;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试维护状态并在render中更新子级,而不是将子级另存为firstContainer和secondContainer

class Parent extends React.Component<any, any> {
    constructor(props) {
        super(props);
        this.state = {
            firstChild: true
        };
    }

    public render() {
        const { firstChild } = this.state;
        <div>
            <Child1 show={firstChild}/>
            <Child2 show={!firstChild} />
        </div>
    }

    public switchContainer() {
        this.setState(({ firstChild }) => ({ firstChild: !firstChild }));
    };
}

然后在子组件中,将show处理为showContent,否则渲染null。如果要保留状态,则不应卸载组件。