【问题标题】:React-redux component does not rerender on store state changeReact-redux 组件不会在存储状态更改时重新呈现
【发布时间】:2016-12-05 07:38:28
【问题描述】:

我今天说要学习 react 和 redux,但我不知道如何在状态更改后强制组件重新渲染。

这是我的代码:

const store = createStore(loginReducer);
export function logout() { return {type: 'USER_LOGIN'} }
export function logout() { return {type: 'USER_LOGOUT'} }
export function loginReducer(state={isLogged:false}, action) {
  switch(action.type) {
    case 'USER_LOGIN':
      return {isLogged:true};
    case 'USER_LOGOUT':
      return {isLogged:false};
    default:


         return state;
      }
    }

    class App extends Component {

      lout(){
        console.log(store.getState()); //IT SHOW INITIAL STATE
        store.dispatch(login());
        console.log(store.getState()); //IT SHOWS THAT STATE DID CHANGE
      }

      ////THIS IS THE PROBLEM, 
    render(){
    console.log('rendering')
    if(store.getState().isLogged){
      return (<MainComponent store={store} />);
    }else{
      return (
        <View style={style.container}>
          <Text onPress={this.lout}>
          THE FOLLOWING NEVER UPDATE :( !!{store.getState().isLogged?'True':'False'}</Text>
          </View>
        );
    }    
}

我可以触发更新的唯一方法是使用

store.subscribe(()=>{this.setState({reload:false})});

在构造函数内部,以便我手动触发组件的更新状态以强制重新渲染。

但是我如何链接存储和组件状态?

【问题讨论】:

    标签: reactjs react-native redux react-redux


    【解决方案1】:

    您的组件只有在其状态或道具发生更改时才会重新渲染。您不依赖 this.state 或 this.props,而是直接在您的渲染函数中获取 store 的状态。

    相反,您应该使用connect 将应用程序状态映射到组件道具。组件示例:

    import React, { PropTypes } from 'react';
    import { connect } from 'react-redux';
    
    export class App extends React.Component {
        constructor(props, context) {
            super(props, context);
        }
    
        render() {
            return (
                <div>
                {this.props.isLoggedIn ? 'Logged In' : 'Not Logged In'}
                </div>
            );
        }
    }
    
    App.propTypes = {
        isLoggedIn: PropTypes.bool.isRequired
    };
    
    function mapStateToProps(state, ownProps) {
        return {
            isLoggedIn: state.isLoggedIn
        };
    }
    
    export default connect(mapStateToProps)(App);
    

    在这个非常简化的例子中,如果 store 的 isLoggedIn 值发生变化,它会自动更新你的组件上对应的 prop,这会导致它渲染。

    我建议阅读 react-redux 文档以帮助您入门: https://redux.js.org/basics/usage-with-react

    【讨论】:

    • 是否需要App.propTypes 才能使用connect()?看起来你只是把它扔进去了。
    • 非常感谢!
    • @KennyWorden 我知道答案可能为时已晚。但是不,你不需要 propTypes。 PropTypes 只是变量的类型声明。它们在这里没有任何其他用途,而 thunk 中间件需要使用连接功能。 daveceddia.com/what-is-a-thunk
    • 我的组件中有完全相同的流程,我的其他值在更改组件时对其做出反应,但是有一个属性没有触发重新渲染,即使在 redux 中更改了值也存储了任何想法?跨度>
    【解决方案2】:

    我最终来到这里是因为我写了一个糟糕的 reducer。我有:

    const reducer = (state=initialState, action) => {
      switch (action.type) {
        case 'SET_Q':
          return Object.assign(state, {                     // <- NB no {}!
            q: action.data,
          })
    
        default:
          return state;
      }
    }
    

    我需要:

    const reducer = (state=initialState, action) => {
      switch (action.type) {
        case 'SET_Q':
          return Object.assign({}, state, {                 // <- NB the {}!
            q: action.data,
          })
    
        default:
          return state;
      }
    }
    

    【讨论】:

    • 非常感谢!这对我来说是正确的答案!
    猜你喜欢
    • 2023-02-25
    • 2019-03-11
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多