React redux组件不会在存储状态更改时重新应答



我今天要学习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})});

在构造函数内部,这样我就可以手动触发组件的更新状态来强制重新发布。

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

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

相反,应该使用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);

在这个非常简化的示例中,如果存储的isLoggedIn值发生更改,它将自动更新组件上相应的道具,从而使其进行渲染。

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

我之所以来到这里,是因为我写了一个糟糕的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;
  }
}

相关内容

  • 没有找到相关文章

最新更新