javascript - 预填充受控组件

标签 javascript meteor reactjs

在我尝试处理更新表单时,编写了以下代码。它是一个受控输入组件,具有相应的状态值。当输入组件发生变化时,状态值会更新。这意味着 View 将始终反射(reflect)数据更改,反之亦然。当尝试使用从数据库获取的数据预填充输入组件时,我的问题出现了。我的尝试是在构造函数中定义初始状态值,使其等于传递的 props,但这不起作用。当组件首次渲染时,它不会包含传递的spirit prop,因为它尚未被获取。当组件第二次渲染时(因为数据已准备好),构造函数将不会被调用。如何在数据准备好时而不是之前设置初始状态?

SpiritsEditContainer

export default createContainer(({params}) => {
    const handle = Meteor.subscribe("spirit", params.id);

    return {
        loading: !handle.ready(),
        spirit: Spirits.find(params.id).fetch()[0]
    }
}, SpiritsEditPage);

烈酒编辑页面

export default class SpiritsEditPage extends Component {
    constructor(props) {
        super(props)

        this.state = {name: this.props.spirit.name}
    }

    handleNameChange(event) {
        this.setState({name: event.target.value});
    }

    handleUpdate(event) {
        event.preventDefault();
    }

    render() {
        const {name} = this.state;

        if (this.props.loading) {
            return <div>loading</div>
        } else {
            return (
                <div>
                    <h1>SpiritsEditPage</h1>

                    <form onSubmit={this.handleUpdate.bind(this)}>
                        <Input type="text"
                               label="Name"
                               value={name}
                               onChange={this.handleNameChange.bind(this)}/>


                        <button>Update</button>
                    </form>
                </div>
            )
        }
    }
}

最佳答案

构造函数代码可能无法正常工作:

constructor(props) {
        super(props)

        this.state = {name: this.props.spirit.name}
    }

而是检查 props.spirit 是否可用。

this.state = { name: this.props.spirit && this.props.spirit.name }

添加一个组件WillReceiveProps:

componentWillReceiveProps(nextProps) {
  if (nextProps.spirit !== this.props.spirit) {
    this.setState({ name: nextProps.spirit.name });
  }
}

其余代码看起来没问题。

关于javascript - 预填充受控组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679671/

相关文章:

Java等价于JavaScript unescape函数

javascript - ViewBag 值返回错误的数字

javascript - autocomplete.js 库不显​​示下拉菜单

javascript - 使用模板加载作为服务器方法 Meteor js 的触发器

meteor - 在Docker中安装Meteor时出现文件权限错误

javascript - 当用户在 Meteor 中提交帖子时,我如何有效地存储用户的位置?

ubuntu - "Error: conflict: logging can' t 满足 "when running " meteor ”命令

reactjs - 在 useEffect 中处理 forEach 后调用 setstate

javascript - 使用 React 隐藏组件

javascript - 在 React 中禁用 Material ui 日历中的特定日期