当前位置: 首页 > 知识库问答 >
问题:

反应组件状态与道具动态输入

华献
2023-03-14

我已经用ReactJS和ES6进行了几天的实验,并创建了两个组件,即

尽管我读了很多教程,但我的子组件仍然拒绝render()这个{this.state.Firstname},尽管我尝试了componentWillMountcomponentDidMount这个。设置状态此。用说明此项。forceUpdate(),但它们会将这个。道具。名字

我欢迎任何建议或帮助。源代码可以在github上找到

谢谢:)

`导出默认类ContactsEdit扩展React。组成部分{

constructor(props) {
    super(props);

    this.contactId = this.props.params.id;
    this.persistence = new Persistence('mock');

    this.state = {
        contact : {}
    };

}

componentDidMount() {
    this.persistence.getContactById( this.contactId ).then( (resolve) => {
        this.setState({ contact : resolve.data });
        this.data = resolve.data;
    }).catch( (reject) => {
        console.log(reject);
    }) ;

    this.forceUpdate();
}

onChange(id,newValue)  {
    this.state.contact[ id ] = newValue;
    this.forceUpdate();
}

saveRecord( object ) {
    console.log( this.state );
}

render() {
    return (            
        <div className="ContactsEdit">
            <h2>Contact Edit (Parent) id : {this.props.params.id}, FullName : {this.state.contact.Firstname} {this.state.contact.Lastname}</h2>
            <div className="row">                    
                <InputText id="Firstname" fieldName={this.state.contact.Firstname}  labelName="Firstname" onChange={this.onChange.bind(this)} divClass="col-lg-3 col-md-3 col-sm-3 col-xs-6" />
                <InputText id="Lastname"  fieldName={this.state.contact.Lastname}  labelName="Lastname"  onChange={this.onChange.bind(this)} divClass="col-lg-3 col-md-3 col-sm-3 col-xs-6" />
                <InputText id="SocSecId"  fieldName={this.state.contact.SocSecId}  labelName="SocSecId"  onChange={this.onChange.bind(this)} divClass="col-lg-3 col-md-3 col-sm-3 col-xs-6" />
                <InputText id="DriverLicId"  fieldName={this.state.contact.DriverLicId}  labelName="DriverLicId"  onChange={this.onChange.bind(this)} divClass="col-lg-3 col-md-3 col-sm-3 col-xs-6" />
            </div>

        </div>
    )
}

}

`

`导出默认类InputText。组成部分{

constructor(props) {
    super(props);         
    this.state = { fieldName : this.props.fieldname}; 
}

componentWillMount() {
    //this.state.fieldName = this.props.fieldname;
    //this.forceUpdate();
}

updateState(evt) {
    //this.setState( {fieldName : evt.target.value} );
    this.props.onChange( evt.target.id, evt.target.value     );
}

render() {
    return (
        <div className={this.props.divClass}>
            <hr />
            <label> {this.props.labelName} </label>
            <div>{this.props.fieldName}</div> 
            <div>{this.state.fieldName}</div> 
            <input 
                type="text" 
                id={this.props.id} 
                value={this.props.fieldName} 
                onChange={this.updateState.bind(this)} 
                className="form-control"
            />
        </div>
    )
}

} `


共有2个答案

司允晨
2023-03-14

我之所以发布这个主题和GitHub链接,是因为我已经尝试了一切。我知道用这个。state不是最佳实践,我将其与结合使用。强制更新,因为将执行此操作。setState()无法工作。

我还知道,在ES6中,componentWillUpdate()已被替换,但删除它并仅使用constructor()对我来说不起作用。

我也试过了

constructor(props) {
    super(props);
    this.setState({ fieldName : 'something' })
// …

但这只会导致将值硬编码到我的组件中。我已尝试使用promise返回值:

constructor(props) {
    super(props);

    MyPromise( (resolve) => {
       this.setState({ fieldName : resolve})
    }
// …

但这也不起作用。

所以我开始想,也许我的gupfile有问题(因此提供了GitHub回购,这样有更多专业知识的人就可以检查和帮助)。

然而,非常奇怪的是,。道具解决方案有效,尽管我知道这不是最佳实践。

仲承福
2023-03-14
匿名用户

this.props在构造函数中不存在,直到它运行后,将this绑定到类的实例。使用从父级传入的props(在参数中)

constructor (props) {
    super(props)
    this.state = { fieldName: props.fieldname }
}

使用ES6类构造函数替换组件

此外,您不应该修改。直接声明。它不会导致react调用render()。仅在构造函数中设置初始状态。在其他任何地方,请调用this。setState({data:newData})

 类似资料:
  • 所以我正处于学习Meteor和React的开始阶段,我刚刚完成了制作待办事项列表的教程。 在实现中,我们在顶部有一个复选框,允许我们在完成的任务和所有任务之间切换。这被设置为一个状态。 每个任务旁边都有复选框,可以将任务显示为已完成或未完成。 我的问题是,这两个复选框都是实时变化的,但只有前者被指定为状态变量?为什么任务复选框是道具?

  • 我见过多个使用Typescript的React组件示例: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++组件 当我们不使用道具或国家时,似乎没有一个明确的惯例。 人们将这些类型设置为,,,, ,等等。这是我到目前为止看到的:

  • 我实际上正在学习reactjs,并且实际上正在开发一个小的TODO列表,包装在一个名为TODO的“父组件”中。 我决定将初始化移到componentDidMount内部,但这似乎是一个反模式,我需要另一个解决方案。你能帮我吗? 下面是我的实际代码:

  • 以下是: code>button.jsx的来源并不重要,它有一个常规的HTML单选按钮,触发本机DOM事件 预期流量为: null 尝试:在的onChange处理程序中: 问题: 尝试:在的onChange处理程序中:

  • 问题内容: 我不知道我是否正确地执行了操作…如果要从输入中获取值,请使用this.refs.whatever.value.trim(),但是如果该输入是无状态函数组件,我该怎么办检索值onSubmit? 我知道这在研究之后是不正确的,但是您应该如何从这些输入字段中获取价值? 这是无状态输入字段 问题答案: 编辑:看起来这不再是问题,因为自编写此答案以来出现了有关如何处理这种情况的新想法。请参阅in