Redux Reducer只返回一个动作的值而不是一个状态?

时间:2017-03-20 07:28:40

标签: reactjs redux react-redux react-on-rails

我有一个Container,一个actionsCreator和一个reducer。在下面的代码中,什么使Reducer返回action.text而不是更新的状态对象?我认为减速器必须总是返回状态。

HelloWorldContainer.jsx

 import { connect } from 'react-redux';
 import HelloWorld from '../components/HelloWorld';
 import * as actionCreators from '../actions/helloWorldActionCreators';

 const mapStateToProps = (state) => ({ name: state.name });

 export default connect(mapStateToProps, actionCreators)(HelloWorld);

helloWorldActionCreators.jsx

 import { HELLO_WORLD_NAME_UPDATE } from '../constants/helloWorldConstants';

 export const updateName = (text) => ({   
   type: HELLO_WORLD_NAME_UPDATE,  
   text, 
 });

helloWorldReducer.jsx

 import { combineReducers } from 'redux';
 import { HELLO_WORLD_NAME_UPDATE } from '../constants/helloWorldConstants';

 const name = (state = '', action) => {
   switch (action.type) {
     case HELLO_WORLD_NAME_UPDATE:
       return action.text
     default:
       return state;
   }
 };

 const mainReducer = combineReducers({ name });

 export default mainReducer;

(代码来源:React on Rails)。

2 个答案:

答案 0 :(得分:3)

name只是状态的一部分。 action.text 更新后的状态。

combineReducers({ name })之后,状态树看起来像:

{
  name: '..'
}

此外,redux并不限制您只能将对象用作您的状态。如果您在没有name的情况下直接将createStore()传递给combineReducers,那么您的整个州将成为一个纯字符串。

答案 1 :(得分:2)

  

我认为减速器必须总是返回状态。

没有。 Reducer必须始终返回数据。此外,您不应该返回state,而是返回一个新对象(或其他数据类型)。

所以在你的情况下做的是每次调度xhdpi动作时reducer返回一个新字符串(或任何数据类型为<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimary" android:orientation="vertical"> <ImageView android:id="@+id/willdialog" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:src="@mipmap/ic_launcher" /> <ImageView android:id="@+id/zauberer" android:layout_width="43dp" android:layout_height="55dp" android:layout_marginLeft="50dp" android:layout_marginStart="50dp" android:layout_marginTop="40dp" android:scaleType="fitXY" android:src="@mipmap/ic_launcher" /> <ImageButton android:id="@+id/btn_verstanden" android:layout_width="130dp" android:layout_height="50dp" android:layout_gravity="center_horizontal" android:layout_marginTop="100dp" android:background="#00000000" android:scaleType="fitXY" android:src="@mipmap/ic_launcher" /> </LinearLayout> )。它不关心状态中已有的内容并返回一个新的文本字符串。