我正在工作whith一个表示组件(ProjectFormUpdate)和他的容器(ProjectFormUpdateContainer)。从容器中,我发送一个文档对象Project和一个标志isLoading。但是在ProjectFormUpdate的Constructor()中,该标志为false ...状态永远不会被注册。我isLoading标志从未在构造函数中设置为true
的代表性componente
import React, { Component} from 'react';
import ReactDOM from 'react-dom';
import { Projects } from '/imports/api/projects.js';
import PropTypes from 'prop-types'; // ES6
import { withTracker } from 'meteor/react-meteor-data';
export default class ProjectFormUpdate extends Component {
handleUpdate(event) {
event.preventDefault();
console.log("se modificó el estadoooo")
this.setState({
codigo: ReactDOM.findDOMNode(this.refs.codigoInput).value.trim(),
nombre: ReactDOM.findDOMNode(this.refs.nombreInput).value.trim()
});
}
handleSubmit(event){
this.setState({
codigo: ReactDOM.findDOMNode(this.refs.codigoInput).value.trim(),
nombre: ReactDOM.findDOMNode(this.refs.nombreInput).value.trim()
});
}
constructor(props) {
super(props);
if (!props.isLoading){
this.state = {
codigo: props.oneProject.codigo,
nombre: props.oneProject.nombre}
}
else{
this.state = {
codigo: 'dd',
nombre: 'ff'}
}
}
render() {
const { oneProject, isLoading } = this.props;
if (!isLoading){
this.setState = {
codigo: this.props.oneProject.codigo,
nombre: this.props.oneProject.nombre}
return (
<div className="col-xs-11">
<div className="box box-solid">
<form className="form" onSubmit={this.handleSubmit.bind(this)} >
<div className="box-body">
<div className="row">
<div className="col-xs-2">
<input
className = "form-control input-sm"
type="text"
ref="codigoInput"
placeholder="Código del Proyecto"
value = {this.state.codigo}//this.state.codigo}
onChange = {this.handleUpdate.bind(this)}
/>
</div>
<div className="col-xs-6">
<input
className = "form-control input-sm"
type="text"
ref="nombreInput"
placeholder="Título"
value = {this.state.nombre }
onChange = {this.handleUpdate.bind(this)}
/>
</div>
</div>
</div>
<div className="box-footer">
<button type="submit" className="btn btn-sm btn-primary btn-flat">Guardar</button>
</div>
</form>
</div>
</div>
);
}
else {return (<div></div>);}
}}
ProjectFormUpdate.propTypes = {
// This component gets the task to display through a React prop.
// We can use propTypes to indicate it is required
oneProject: React.PropTypes.object,
isLoading: React.PropTypes.bool,
};
容器
import { Meteor } from 'meteor/meteor';
import { withTracker } from 'meteor/react-meteor-data';
import { Projects } from '/imports/api/projects.js';
import ProjectFormUpdate from './ProjectFormUpdate.jsx';
export default ProjectFormUpdateContainer = withTracker(({ key1 }) => {
const sub = Meteor.subscribe('projects');
var oneProject = Projects.findOne(key1);
var isLoading = !sub.ready();
return {
oneProject,
isLoading,
};
})(ProjectFormUpdate);
所以......如果我不能设置状态,我不能在controled方式设置窗体的值。任何建议?
感谢回答阿尔曼。你的代码帮了我很多。但是,不幸的是,我还没有找到解决这个问题的方法。如果我在构造函数中,或者在componentWillMount()或componentDidMount()中执行它...从未设置状态,因此isLoading始终为真。 – Reactib
嗨,队友。很高兴我能帮上忙。这表明你的'const sub = Meteor.subscribe('projects')'方法不会为'.ready()'返回'true'。我会检查你是否已经使用以下文档正确实现了这个论点:[React Meteor Data](https://github.com/meteor/react-packages/tree/devel/packages/react-meteor-data)和[ Meteor.subscribe()](https://docs.meteor.com/api/pubsub.html#Meteor-subscribe)。为''.onReady()'和'.onStop()'回调函数的输出设置控制台日志可能会有帮助。祝一切顺利! –