gpt4 book ai didi

reactjs - React 路由器主从 : children component don't render new view until page refresh

转载 作者:行者123 更新时间:2023-12-03 13:58:21 24 4
gpt4 key购买 nike

我正在创建一个主从导航,就像这里的示例 the react router example ;

我有一个容器组件 OneCheckpointContainer,它呈现一个导航面板 CheckpointNav (链接)和一个数据组件 OneCheckpointData (这个家伙加载时获取数据,并呈现 OneCheckpointView

当我单击 CheckpointNav 中的链接之一时,除了浏览器中的 URL 发生变化之外,没有任何反应。直到我刷新页面才获取新数据,然后在 subview 中呈现一个新组件。 (也没有错误)

我不确定这个错误是否是因为子组件还负责获取数据以及 View 。

以下是我如何设置路线:

  <Route path="/modules/:id" component={OneCheckpointContainer}>
<Route path="/modules/:id/checkpoints/:cp_id" component={OneCheckpointData} />
</Route>

OneCheckpointContainer

import React from 'react';
import CheckpointNav from './CheckpointNav';

class OneCheckpointContainer extends React.Component {
constructor(props, context) {
super(props, context);

this.state = {
checkpoints: null,
user: null
};

}

componentWillMount() {
this.loadCheckpoints();
this.context.getUser((data) => this.setState({ user: data }));
}

loadCheckpoints() {
$.ajax({
url: `/api/v1/modules/student/${this.props.params.id}/checkpoints`,
method: 'GET',
}).done((data) => {
this.setState({ checkpoints: data });
});
}

render() {
return (
<div>
<div className="col-xs-3">
<CheckpointNav mid={this.props.params.id} checkpoints={this.state.checkpoints} />
</div>
<div className="col-xs-9">
{ this.props.children || <div>No Children Yet</div>}
</div>
</div>
)
}
}

OneCheckpointContainer.displayName = OneCheckpointContainer;

OneCheckpointContainer.contextTypes = {
getUser: React.PropTypes.func.isRequired
};

export default OneCheckpointContainer;

这是CheckpointNav,但我不相信错误就在这里:

import React from 'react';
import NavLink from '../widgets/NavLink';

const CheckpointNav = (props) => {
const checkpointList = props.checkpoints && props.checkpoints.length > 0 ?
props.checkpoints.map((item) => {
return <li key={item.cp._id} className="list-group-item">
<NavLink className="nav-link" to={"/modules/" + props.mid + "/checkpoints/" + item.cp._id}>
{ item.cp.title}</NavLink></li>
}) : <div>No CPS</div>;
return (
<div className="card one-module-card">
<div className="card-block modules-card-body">
<ul className="list-group tags-group">
{ checkpointList }
<li className="list-group-item new-cp"><NavLink className=""
to={'/post/checkpoint/' + props.mid}
>
New Checkpoint
</NavLink></li>
</ul>
</div>
</div>
);

};

export default CheckpointNav;

OneCheckpointData除非刷新,否则不会获取新数据并呈现新数据

import React from 'react';
import CheckpointView from './CheckpointView';

class OneCheckpointData extends React.Component {
constructor(props, context) {
super(props, context);

this.state = {
checkpoint: null,
user: null
};

}

componentWillMount() {
this.loadCheckpoint();
this.context.getUser((data) => this.setState({ user: data }));
}

loadCheckpoint() {
$.ajax({
url: `/api/v1/modules/three/cp/${this.props.params.cp_id}`,
method: 'GET',
}).done((data) => {
this.setState({ checkpoint: data });
});
}

render() {
return this.state.checkpoint ? <CheckpointView user={this.state.user} checkpoint={this.state.checkpoint} /> : null;
}
}

OneCheckpointData.displayName = OneCheckpointData;

OneCheckpointData.contextTypes = {
getUser: React.PropTypes.func.isRequired
};

export default OneCheckpointData;

** 我遗漏了 OneCheckpointView,因为它应该是无关的 **

最佳答案

在这种情况下,您可以将 props 作为 loadCheckpoing(props) 函数的参数获取,并且可以在 componentWillReceiveProps 上发送新的 props,如下所示

componentWillMount(this.props) {
this.loadCheckpoint(this.props);
}

componentWillReceiveProps(nextprops) {
this.loadCheckpoint(nextprops);
}

loadCheckpoint(props) {
this.context.getUser((data) => this.setState({ user: data }));
$.ajax({
url: `/api/v1/modules/three/cp/${props.params.cp_id}`, //please check i have replace the this.props to props as we have props as a parameter
method: 'GET',
}).done((data) => {
this.setState({ checkpoint: data });
});
}

我更喜欢使用react-redux或reflux库来处理你的ajax数据查询,但我提出的解决方案应该可以为你完成这项工作。

关于reactjs - React 路由器主从 : children component don't render new view until page refresh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com