我正在从我的组件中的WebAPI调用中获取数据。我把价值观放入状态。
渲染表单时,我只是使用数据(组件)制作自定义标签,并将标签文本和数据传递给该组件。(我显示的每个字段一个)。我通过道具将状态值传递给子组件。
但我发现我的子组件在渲染时没有填充数据。。。因为这似乎发生在api调用之前。api发生时,状态被设置,但数据永远不会到达子组件。我认为道具会将更新后的状态数据传递给组件。我错了。我应该如何做到这一点?我希望在父级中加载数据,然后呈现子组件,并传入数据。
componentDidMount() {
this.loadData();
}
loadData() {
var request = {
method: 'GET',
URL: "http://example.com/api/user/profile",
}
fetchData(request).then(response => {
if(response.errorcode != "OK")
{
console.log("Bad response from API. Need to redirect!")
}
else
{
this.setState(
{
firstname: response.payload.firstname,
surname: response.payload.surname,
email: response.payload.email,
countryId: response.payload.countryId,
countries: response.payload.countries
}
);
}
});
}
render() {
return (
<div>
<h2>Your Profile</h2>
<div className="row">
<div className="col-xs-6">
<DisplayLabel labelText={"Firstname"} data={this.state.firstname} />
<DisplayLabel labelText={"Surname"} data={this.state.surname} />
<DisplayLabel labelText={"Email Address"} data={this.state.email} />
<DisplayLabel labelText={"Country"} data={this.state.countryId} />
<div className="form-group row right">
<button className="btn btn-primary" onClick={this.openModal}>Edit</button>
</div>
</div>
</div>
<Modal isOpen={this.state.modalIsOpen} onAfterOpen={this.afterOpenModal} style={modalStyle}>
<ProfileEditBox closeMeCallback = {this.closeModal} />
</Modal>
</div>
)
}
我的显示标签组件就是这样。我是新来的,只是想制作可重复使用的组件:
import React, {Component} from 'react';
export default class DisplayLabel extends Component {
constructor(props)
{
super(props);
this.state = {
labelText: this.props.labelText,
data: this.props.data
}
console.log(this.state);
}
componentDidMount() {
this.setState({
labelText: this.props.labelText,
data: this.props.data
});
console.log("ComponentDidMount", this.state);
}
render() {
return (
<div>
<div className="row">
<div className="col-xs-12">
<label className="control-label">{this.state.labelText}</label>
</div>
</div>
<div className="row">
<div className="col-xs-12">
<strong><span>{this.state.data}</span></strong>
</div>
</div>
</div>
)
}
}
在呈现表单之前,我需要等待API调用完成吗?
只是因为构造函数在组件装载时调用了一次,所以您可以做一件事,在渲染中使用两个var并将数据分配到其中。然后使用这些变量来显示数据。因为每次父组件的状态改变时,子组件都会呈现,但构造函数不会。
我不确定您是否必须等待请求完成(但您很可能必须等待UI问题),但我猜您的问题是其他问题。
您将道具包含在您的状态中(这是不必要的),然后当组件完成加载时,您再次更新状态,但是请求可能在组件完成加载后完成。
如果必须将道具放入状态,则应添加componentDidUpdate或componentWillReceiveNewProps生命周期函数,而不是componentDidMount。
但是,如果不必(最有可能),可以将渲染函数更改为:
render() {
return (
<div>
<div className="row">
<div className="col-xs-12">
<label className="control-label">{this.props.labelText}</label>
</div>
</div>
<div className="row">
<div className="col-xs-12">
<strong><span>{this.props.data}</span></strong>
</div>
</div>
</div>
)
}
(只是把状态改为道具)
试试看,祝你好运!
这是React中常见的问题。我通常尝试用显示某种加载指示器的模式来解决它。因此,我将在构造函数中初始化您的状态
,如下所示:
this.state = {
loading: true
}
我将更改您的渲染
,以检查加载
bool:
render() {
if (this.state.loading) {
return (<h1>Loading, please wait...</h1>);
}
return (
<div>
<h2>Your Profile</h2>
<div className="row">
<div className="col-xs-6">
<DisplayLabel labelText={"Firstname"} data={this.state.firstname} />
<DisplayLabel labelText={"Surname"} data={this.state.surname} />
<DisplayLabel labelText={"Email Address"} data={this.state.email} />
<DisplayLabel labelText={"Country"} data={this.state.countryId} />
<div className="form-group row right">
<button className="btn btn-primary" onClick={this.openModal}>Edit</button>
</div>
</div>
</div>
<Modal isOpen={this.state.modalIsOpen} onAfterOpen={this.afterOpenModal} style={modalStyle}>
<ProfileEditBox closeMeCallback = {this.closeModal} />
</Modal>
</div>
)
}
然后,您可以在成功的数据提取后将加载
设置为false
,并且您的表单将正确显示,没有任何错误。
(我编辑这篇文章是为了使用您的父组件,而不是DisplayLabel
,因为它在这里更有意义。但是,您的问题中忽略了组件名称)。
问题内容: 在组件中,我需要将函数的返回值传递给属性。然后从属性需要被传递到的组件。新来的反应。不确定如何将属性从子级传递到组件。 问题答案: 您可以将函数从父级传递给子级,子级可以使用颜色调用该函数(很多操作都类似于事件处理程序)。在App中收到颜色后,使用.setState()将其分配给状态值,然后将其在render()中获取
我在找到一种将道具传递给组件子组件的方法时遇到了一点麻烦。我想做的是有一个组件(ParentComponent)它有一个函数(toggleSuccess())来改变它自己的状态(例如一个名为成功的布尔值),并将该函数作为onClick道具传递给它的所有子函数。理想情况下,我可以将各种组件放入ParentComponent,它们都可以通过onClick道具访问toggleSuccess()。有没有一
问题内容: 我在这里有一个简单的设置: 我有一个父组件,该父组件有2个子组件。在第一个子组件中:用户更改输入的值。然后,该更改的值将是我想要从该孩子传递给父对象的道具,以便可以将其传递给与同一父组件相连的另一个孩子。 当前设置的这个,请查看 从用户输入到UI更改的流程:1.在“ Child 1”中:调整一个滑块,将onChange值传递给父组件;2.将此属性(新的滑块值)传递给Parent组件,以
我想在React中将数据从子组件发送到父组件。查找数据时,只有类类型,没有功能文档。您可以使用什么语法传递数据?
我是一个相当新的反应,这是一个我正在努力解决的问题。
问题内容: 我试图找到定义可以以一般方式使用的组件的正确方法: 当然,可以想象并在父组件和子组件之间进行渲染的逻辑。 对于这个问题,这是一个虚拟的实现: 问题是,每当您用于定义包装器组件时,如何将某些属性传递给其所有子组件? 问题答案: 用新道具克隆Children 您可以使用React.Children遍历子级,然后使用React.cloneElement使用新的道具(浅合并)克隆每个元素,例如
问题内容: 我正在尝试找到定义可以以一般方式使用的某些组件的正确方法: 当然,您可以想象并作为该逻辑的示例,在父组件和子组件之间存在一种渲染逻辑。 对于这个问题,这是一个虚拟的实现: 问题是,每当您用于定义包装器组件时,如何将某些属性传递给其所有子组件? 问题答案: Cloning children with new props 您可以使用React.Children遍历子级,然后使用React.
我试图使用在child中的函数中生成的值。js并将其传递给父级。所以我可以使用这个值来过滤子数组。 小孩js 是生成的值,我需要在父级中访问该值。js Parent.js 我是不是错过了一些显而易见的东西?控制台。日志for返回子项的所有值。js节点,但当用作道具时返回未定义。 如何让函数运行,这样我就可以用返回的值过滤结果? 谢谢