我正在开发一个应用程序,该应用程序需要异步获取一些数据,并将状态保存在父组件中,但也需要将数据引用传递给子组件。问题是,一旦数据加载到状态,道具就不会更新到新的状态。如何使支持在父状态更改时自动更新?
这是我的密码:
class App extends Component {
state = {
contract: null,
ethereum: null,
user: null
};
componentDidMount() {
let ethereum = window.ethereum || null;
this.setState({ ethereum });
}
getContainerClasses() {
let classes = "container";
classes += this.state.ethereum === null ? " invisible" : "";
return classes;
}
render() {
return (
<React.Fragment>
<Nav />
<div className={this.getContainerClasses()}>
<Intro ethereum={this.state.ethereum} />
<Load />
<Deploy />
</div>
</React.Fragment>
);
}
}class Intro extends Component {
constructor() {
super();
this.handleClick = this.handleClick.bind(this);
}
render() {
return (
<React.Fragment>
...
</React.Fragment>
);
}
handleClick() {
console.log(this.props.ethereum);
}
getContainerClasses() {
let classes = "container";
classes += this.props.ethereum !== null ? " " : "";
return classes;
}
}正如您在我的示例中所看到的,我正在尝试通过单击按钮记录this.props.ethereum。不幸的是,它没有注销App组件中可访问的数据(在Chrome工具中是可见的)。
编辑:,我误解了我的日志。道具正在更新,但是当状态发生变化时,getContainerClasses()不会被触发。
基本上,我要做的是隐藏内容,而数据还没有加载,并尽快披露它。
发布于 2019-02-25 18:18:00
可能组件挂载windows.ethereum的那一刻还没有定义。似乎ethereum是以asyn方式设置的,因此您的React组件不知道何时发生。在定义ethereum时,您必须添加一些事件侦听器来作出反应。可以在dev tools中看到正确的值,因为在那里您可以访问对象引用,因此您总是可以在dev工具中看到最新的值。
您可能使用了一些ethereum库,它应该包括一些API方法,允许在一切就绪并初始化时作出反应。下面是psedu代码,展示了如何实现它:
componentDidMount() {
ethereum.addEventListener('ready', (ethereumObject) => this.setState({ethereum: ethereumObject}))
}https://stackoverflow.com/questions/54872269
复制相似问题