全局变量更改时重新渲染

时间:2019-02-06 12:44:16

标签: reactjs

当全局变量更改时,我想重新渲染组件。我的代码现在看起来像这样

window.loading = true;

setTimeout(() => {
  window.loading = false;
}, 4000);

class MyComponent extends React.Component {
  state = { rerender: window.loading }

  render() {
    return (
      <h1>{`Loading: ${this.state.rerender}`}</h1>
    )
  }
}

但是什么也没发生,尽管我可以看到window.loading在控制台中更新了。

3 个答案:

答案 0 :(得分:0)

如果要在全局属性更改后重新渲染组件,则应使用Promise,RxJS或任何其他类似模式的Observer。

在代码中的位置:

window.loading = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve();
  }, 300);
});

在您的组件中:

class MyComponent extends React.Component {

  state = { isLoaded: false }

  componentDidMount() {
   window.loading.then(() => 
     this.setState({isLoaded: true})
   )
  }


  render() {
    const {isLoaded} = this.state;
    return (
      ...
    )
  }
}

这样,您可以在某些全局属性更改(解决)之后重新渲染组件。关键是使用Promise代替bool原始

希望有帮助

答案 1 :(得分:0)

您应该将全局变量作为prop传递给组件。当前,您的状态不会自动更新,因此不会重新呈现。

class MyComponent extends React.Component {

constructor(props) {
super(props);
}

render() {
return ( <h1>{`Loading: ${this.props.rerender}`}</h1>)
}
}

当创建组件时,将其作为道具传递:

 <MyComponent rerender={window.loading }

答案 2 :(得分:0)

我正在使用React Hooks

const ChildComponent = ({ fuse }) => {
  const [legalText, setLegalText] = useState([]);

  window.loading = () => {
    setLegalText(JSON.parse(sessionStorage.getItem('legal')));
  };
}

我们在ChildComponent内部创建了一个全局函数。您需要做的就是调用window.loading在应用程序中的任何地方,此功能将触发。

绝对使用redux,mobX或上下文API。在某些情况下,这很方便