react-native redux 操作

1.项目目录

2.redux

(1)app/redux/action/action.js

/**
 * 步骤一
 * 行为 action
 */
 
// 定义行为名称
export const CHANGE_TEXT = 'CHANGE_TEXT';
 
// 初始化 CHANGE_TEXT 对象
export const changeText = (text) => { // 接收test参数
  return {
    type: CHANGE_TEXT, // 名称
    text // 参数 默认值
  }
};

(2)app/redux/reducer/reducer.js

/**
 * 步骤二
 * 操作
 * 通过reducer操作action(根据action行为创建reducer文件)
 */
 
/**
 * 引入 action
 * CHANGE_TEXT 类型(行为名称)
 * changeText 值
 */
import { CHANGE_TEXT, changeText } from '../action/action';
 
/**
 * 创建 reducer
 * 根据名称判断是哪一个行为
 * state = changeText('welcome to React Native') 初始化state
 */
const mainReducer = (state = changeText('welcome to React Native'), action) => {
  /**
   * state 不能直接改变
   * 定义newState 接收state的值
   */
  const newState = state;
  const text = action.text;

  // 判断 action 类型
  switch (action.type) {
    case CHANGE_TEXT:
      return {
        // 返回所有的newState
        ...newState,
        text: '改变了' + text
      };

    default:
      return {
        ...newState,
        text:state.text
      }
  }
};
 
// 输出口
export default mainReducer;

(3)app/redux/store/store.js

/**
 * 步骤三
 * 初始化 store
 */
// 引入 reducer(操作)
import Reducer from '../reducer/reducer';
// 获取redux中的初始化方法 createStore
import { createStore } from 'redux';
 
// 输出
export default () => {
  
  // 根据 reducer 初始化 store
  const store = createStore(Reducer);

  return store;
}

3.页面引用

(1)app/containers/Index.js

/**
 * 容器组件
 * 入口文件
 */
import React, { Component } from 'react';
 
// 引用外部文件
import { Provider } from 'react-redux';
import Main from './Main';
import configureStore from '../redux/store/store';
 
// 调用 store 文件中的 mainReducer常量中保存的方法
const store = configureStore();
// 定义根组件
export default class Root extends Component {
  render() {
    return(
      // 第一层包装,为了让 main 能够拿到 store
      <Provider store={store}>
        <Main />
      </Provider>
    )
  }
}

(2)app/containers/Main.js

/*主页面*/
import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
} from 'react-native';

// 引入 测试组件
import TestText from '../components/TestText'
/**
 * 获取 react-redux的 connect() 方法
 * 注:使组件层级中的 connect() 方法能够得到 redux store
 */
import { connect } from 'react-redux';
// 获取 action行为的值
// import { CHANGE_TEXT } from '../redux/action/action';
import { changeText } from '../redux/action/action';
 
class Main extends Component {
  render() {
    // 通过 props 拿到保存的 onChangeText
    const { onChangeText } = this.props;
    
    return (
      <View style={styles.container}>
        {/* 需要改变的组件 */}
        {/* 将父组件(Main)的props,传递给子组件(TestText)*/}
        <TestText {...this.props} />
        
        {/* 按钮 */}
        <TouchableOpacity
          // 设置按钮点击事件
          onPress={onChangeText}
        >
          <Text>改变文字按钮</Text>
        </TouchableOpacity>
      </View>
    );
  }
}
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
});

/************ 初始化 ************/
// 获取 state 变化
const mapStateToProps = (state) => {
  return {
    // 获取 state 变化
    value: state.text,
  }
};
 
// 发送行为
const mapDispatchToProps = (dispatch) => {
  return {
    // 发送行为
    // onChangeText: () => dispatch({type: CHANGE_TEXT}),
    onChangeText: () => dispatch(changeText('外部传值')),
  }
};
 
/**
 * 通过 connect() 方法 对Main组件进行第二层包装
 * 进行第二层包装,生成的新组件拥有 接收和发送 数据的能力
 * mapStateToProps 获取状态的函数
 * mapDispatchToProps 发送行为的函数
 */
export default connect(mapStateToProps, mapDispatchToProps)(Main);

(3)app/components/TestText.js

/*测试组件*/
import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  View
} from 'react-native';
 
export default class TestText extends Component {
  render() {
    // 获取 props 中的 value
    const { value } = this.props;

    return (
      // 根据 value 改变内部文字
      <Text>{value}</Text>
    );
  }
}

.

posted @ 2018-03-24 21:23  每天都要进步一点点  阅读(324)  评论(0编辑  收藏  举报