React-router - Link 启动太快
React-router - Link firing too soon
我刚刚开始将 react-router 集成到我的应用程序中,它运行得非常棒。但是,我确实有一个小问题。有一次我需要单击一个按钮,该按钮会更改为不同的页面,但还需要进行操作调用(转到服务器并获取要在 table 中显示的数据)。目前 react-router link 在动作之前触发,因此此时会破坏应用程序,因为没有数据可以映射!
我的问题是如何更改这些事件发生的顺序,以便在页面更改时存储中存在数据(通过操作更新)?
当前代码块:
import React from 'react';
import { Link } from 'react-router';
import List from 'material-ui/lib/lists/list';
import ListItem from 'material-ui/lib/lists/list-item';
import ActionInfo from 'material-ui/lib/svg-icons/action/info';
import { getTable } from '../../actions/DALIActions';
import TokenStore from '../../stores/TokenStore';
import TableStore from '../../stores/TableStore';
const styles = {
root: {
paddingTop: 200,
width: '100%',
},
headerStyle: {
textAlign: 'center',
},
container: {
border: 'solid 1px #d9d9d9',
height: 500,
overflow: 'hidden',
},
};
class MainTablePage extends React.Component {
getTable(id) {
getTable(TokenStore.getToken(), id);
}
addTables() {
let tableArray = TableStore.getTables().objects;
console.log(tableArray);
let tableList = tableArray.map((el, i) => {
return (
<ListItem
key={i}
id={el.id}
primaryText={el.title}
leftIcon={<ActionInfo />}
containerElement={<Link to="/table" />}
linkButton={true}
onTouchTap={this.getTable.bind(this, el.id)}
/>
);
});
return tableList;
}
render() {
return (
<div>
<div style={styles.headerStyle}>
<h1>Here are the current tables available</h1>
</div>
<div style={styles.root}>
<div style={styles.container}>
<List>
{this.addTables()}
</List>
</div>
</div>
</div>
);
}
}
export default MainTablePage;
哦,是的,我正在使用 material-ui,所以这可能无济于事!
如有任何帮助,我们将不胜感激
感谢您的宝贵时间
在组件中触发操作 componentDidMount()
并在您的商店中设置加载状态。
触发操作并发出请求后,将加载状态设置为 true。获取数据后,将其设置回 false。这样你就渲染了一个加载器而不是依赖于尚未获取的数据的组件。
我更新了您的代码以展示它是如何工作的。如果您还有其他问题,请告诉我。
这里有一个 link 到 React 的 lifecycle methods 以获取更多信息。
class MainTablePage extends React.Component {
componentDidMount() {
// fire your action here
}
getTable(id) {
getTable(TokenStore.getToken(), id);
}
addTables() {
let tableArray = TableStore.getTables().objects;
console.log(tableArray);
let tableList = tableArray.map((el, i) => {
return (
<ListItem
key={i}
id={el.id}
primaryText={el.title}
leftIcon={<ActionInfo />}
containerElement={<Link to="/table" />}
linkButton={true}
onTouchTap={this.getTable.bind(this, el.id)}
/>
);
});
return tableList;
}
render() {
const { loading } = this.props; // loading state from your store
if (loading) {
// return a loader component while your data is fetched
return <Loader />;
}
return (
<div>
<div style={styles.headerStyle}>
<h1>Here are the current tables available</h1>
</div>
<div style={styles.root}>
<div style={styles.container}>
<List>
{this.addTables()}
</List>
</div>
</div>
</div>
);
}
}
我刚刚开始将 react-router 集成到我的应用程序中,它运行得非常棒。但是,我确实有一个小问题。有一次我需要单击一个按钮,该按钮会更改为不同的页面,但还需要进行操作调用(转到服务器并获取要在 table 中显示的数据)。目前 react-router link 在动作之前触发,因此此时会破坏应用程序,因为没有数据可以映射!
我的问题是如何更改这些事件发生的顺序,以便在页面更改时存储中存在数据(通过操作更新)?
当前代码块:
import React from 'react';
import { Link } from 'react-router';
import List from 'material-ui/lib/lists/list';
import ListItem from 'material-ui/lib/lists/list-item';
import ActionInfo from 'material-ui/lib/svg-icons/action/info';
import { getTable } from '../../actions/DALIActions';
import TokenStore from '../../stores/TokenStore';
import TableStore from '../../stores/TableStore';
const styles = {
root: {
paddingTop: 200,
width: '100%',
},
headerStyle: {
textAlign: 'center',
},
container: {
border: 'solid 1px #d9d9d9',
height: 500,
overflow: 'hidden',
},
};
class MainTablePage extends React.Component {
getTable(id) {
getTable(TokenStore.getToken(), id);
}
addTables() {
let tableArray = TableStore.getTables().objects;
console.log(tableArray);
let tableList = tableArray.map((el, i) => {
return (
<ListItem
key={i}
id={el.id}
primaryText={el.title}
leftIcon={<ActionInfo />}
containerElement={<Link to="/table" />}
linkButton={true}
onTouchTap={this.getTable.bind(this, el.id)}
/>
);
});
return tableList;
}
render() {
return (
<div>
<div style={styles.headerStyle}>
<h1>Here are the current tables available</h1>
</div>
<div style={styles.root}>
<div style={styles.container}>
<List>
{this.addTables()}
</List>
</div>
</div>
</div>
);
}
}
export default MainTablePage;
哦,是的,我正在使用 material-ui,所以这可能无济于事!
如有任何帮助,我们将不胜感激
感谢您的宝贵时间
在组件中触发操作 componentDidMount()
并在您的商店中设置加载状态。
触发操作并发出请求后,将加载状态设置为 true。获取数据后,将其设置回 false。这样你就渲染了一个加载器而不是依赖于尚未获取的数据的组件。
我更新了您的代码以展示它是如何工作的。如果您还有其他问题,请告诉我。
这里有一个 link 到 React 的 lifecycle methods 以获取更多信息。
class MainTablePage extends React.Component {
componentDidMount() {
// fire your action here
}
getTable(id) {
getTable(TokenStore.getToken(), id);
}
addTables() {
let tableArray = TableStore.getTables().objects;
console.log(tableArray);
let tableList = tableArray.map((el, i) => {
return (
<ListItem
key={i}
id={el.id}
primaryText={el.title}
leftIcon={<ActionInfo />}
containerElement={<Link to="/table" />}
linkButton={true}
onTouchTap={this.getTable.bind(this, el.id)}
/>
);
});
return tableList;
}
render() {
const { loading } = this.props; // loading state from your store
if (loading) {
// return a loader component while your data is fetched
return <Loader />;
}
return (
<div>
<div style={styles.headerStyle}>
<h1>Here are the current tables available</h1>
</div>
<div style={styles.root}>
<div style={styles.container}>
<List>
{this.addTables()}
</List>
</div>
</div>
</div>
);
}
}