【问题标题】:How to make component re-render when value from outside changes?当来自外部的值发生变化时,如何使组件重新渲染?
【发布时间】:2017-05-06 14:19:31
【问题描述】:

所以,我有这样的简单代码(类):

export default class LoginAction {
  isLoggedIn = () => {
    return true
  }
}

我在我的其他课程中这样使用它:

export default class Main extends Component {
  render = () => {
    const loginAction = new LoginAction()

    if (loginAction.isLoggedIn()) {
      return (
        <View style={{ flex: 1 }}>
          <Header headerText={'Post List'} />
          <PostList />
        </View>
      )
    }

    ....... (split)
  }
}

问题是,当我更改 isLoggedIn 函数的返回值时,为什么 Main 组件没有重新渲染?

它是 React Native,我使用热重载。

【问题讨论】:

    标签: javascript authentication reactjs react-native ecmascript-6


    【解决方案1】:

    组件仅在 2 种情况下重新渲染:

    • 如果其state 已更改
    • 如果收到的props 发生了变化

    在您的 Main 组件中,这些情况都不会发生。

    要修复它,您可以将 isLoggedIn 传递给您的组件:

    // index.js
    
    const loginAction = new LoginAction()
    let isLoggedIn = loginAction.isLoggedIn()
    
    const setLoggedUser = user => {
      loginAction.setLoggedUser(user)
      isLoggedIn = true
    }
    
    ReactDOM.render(
      <div>
        {!isLoggedIn && <Login setLoggedUser={setLoggedUser} />}
        <Main isLoggedIn={isLoggedIn} />
      </div>,
      document.getElementById('root')
    )
    

    并在组件的渲染中使用这个道具:

    export default class Main extends Component {
      render = () => {
        if (this.props.isLoggedIn) {
          return (
            <View style={{ flex: 1 }}>
              <Header headerText={'Post List'} />
              <PostList />
            </View>
          )
        }
        ...
      }
    }
    

    这样做时,您的组件将在isLoggedIn 更改时重新渲染。

    【讨论】:

    • 或者.forceUpdate() 我想。也许还有其他人?
    • @GG。哇哦,我已经阅读了一些关于它的内容。但是,我试图弄清楚的是当我在另一个类上创建函数时。有可能吗?
    • @naomik 哇,我不知道这种方法。 :) 作为旁注,来自文档:“通常,您应该尽量避免使用 forceUpdate(),并且只在 render() 中读取 this.props 和 this.state。”
    • @naomik 嗯,我不这么认为。我发现很多答案说不要使用 forceUpdate()。
    • @GG.,是的,它只在特殊情况下使用^_^
    猜你喜欢
    • 2017-10-18
    • 2020-02-27
    • 2022-06-30
    • 1970-01-01
    • 2020-10-16
    • 2021-07-09
    • 2022-01-24
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多