javascript - react : passing component's state to container

标签 javascript reactjs

组件的状态可以传递到其容器吗?我正在做这样的事情:

export class MyContainer extends Component {
    static propTypes = {
        dispatch: PropTypes.func.isRequired,
        someText: PropTypes.string,
        isDisabled: PropTypes.bool,
    };

    onSave = () => {
        this.props.dispatch(actions.saveDetails(this.props.someText));
    }

    render() {
        return (
            <SaveComponent onSave={this.onSave}>
                <SaveContent
                    someText={this.props.someText}
                    isDisabled={this.props.isDisabled}
                />
            </SaveComponent>
        );
    }
}

export class SaveContent extends Component {
    state = {
        someText: this.props.someText,
        disabled: this.props.isDisabled,
    };

    onInputChange = (e) => {
        const field = {};
        const { name, value } = e.target;

        field[name] = value;
        this.setState(field);
    };

    render() {
        return (
            <input
                type="text"
                name="someText"
                onChange={this.onChange}
                value={this.state.someText}
                disabled={this.state.isDisabled}
            />
        );
    }
}

组件(SaveComponent 和 SaveContent)是由其他人完成的,我只是尝试将 API 调用集成到 UI。该表单位于一个组件中,该组件嵌套在具有保存功能的组件中。据我了解,容器应该只是将数据和事件处理程序传递给组件。如何获取 SaveContent 的 state.someText 以便将其传递给容器的 onSave 方法中的 actions.saveDetails

最佳答案

您必须将 someText 保存到 MyContainer 的状态,并将其传递给 SaveContent。由于React中的单向绑定(bind),父组件可以将数据传递给子组件,但子组件只能使用父组件处理和保存的某些数据来触发事件。

我会这样做:

export class MyContainer extends Component {
 static propTypes = {
     dispatch: PropTypes.func.isRequired,
     someText: PropTypes.string,
     isDisabled: PropTypes.bool,
 };

 state = { someText: this.props.someText, }

 onSave = () => {
     this.props.dispatch(actions.saveDetails(this.state.someText));
 }

 onInputChange = (field) => { this.setState(field); }

 render() {
     return (
         <SaveComponent onSave={this.onSave}>
             <SaveContent
                 onInputChange={this.onInputChange}
                 value={this.state.someText}
                 someText={this.props.someText}
                 isDisabled={this.props.isDisabled}
             />
         </SaveComponent>
     );
 }
}

export class SaveContent extends Component {
 state = {
      // someText: this.props.someText,
      disabled: this.props.isDisabled,
  };

 onInputChange = (e) => {
     const field = {};
     const { name, value } = e.target;

     field[name] = value;
     // this.setState(field);
     this.props.onInputChange(field);
 };

 render() {
     return (
         <input
             type="text"
             name="someText"
             onChange={this.onInputChange}
             value={this.props.value}
             disabled={this.state.isDisabled}
         />
     );
 }
}

关于javascript - react : passing component's state to container,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44153089/

相关文章:

javascript - 使用 jquery val() 方法调用输入值在我的 MVC View 中的空格后不起作用?

javascript - 尝试将一个 html 页面动态嵌入到另一个页面中

javascript - 如何在 react 中点击时填充初始数据

reactjs - 在 React 应用程序中拥有服务

javascript - 在 javascript/typescript 中向 Date 添加天数会给出完全错误的日期

javascript - 获取 : reject promise and catch the error if status is not OK?

javascript - 对象上没有纹理的 webGL 环境照明

reactjs - 如何编写测试用例来检查函数是否返回确切的组件

javascript - 为什么在制作日期选择器的 React JS 中不导入 css?

node.js - 如何在同一个 Heroku 应用程序上部署前端和后端 Node.js?