react-native - 将数据提取到状态不像文档 - 在 mapStateToProps 中反应本机和 redux
问题描述
我是反应原生和 redux 的新手。当我将组件连接到商店并使用 mapStateToProps 函数将状态映射到组件道具时,我注意到组件状态位于 state.component_reducer,例如,如果我在组件中存储了一个名为 isFetching 的变量,那么我可以在 state.isFetching 中找到它(正如我在 react redux 文档中阅读的那样),但就我而言,我可以在 state.component_reducer.isFetching 中找到它。我想我做错了什么,但我不知道是什么。
动作.js
import OrdersAPI from '../../services/api/Orders'
export const REQUEST_ORDERS = 'REQUEST_ORDERS'
export const RECEIVE_ORDERS = 'RECEIVE_ORDERS'
export const requestOrders = username => ({
type: REQUEST_ORDERS,
})
export const receiveOrders = (json) => ({
type: RECEIVE_ORDERS,
orders: json
})
const fetchOrders = username => dispatch => {
dispatch(requestOrders(username))
return OrdersAPI.getUserOrders(username)
.then(json => dispatch(receiveOrders(json)))
}
// temp imp
const shouldFetchOrders = (state) => {
const orders = state.orders
if (!orders) {
return true
}
return false;
}
export const fetchOrdersIfNeeded = username => (dispatch, getState) => {
if (shouldFetchOrders(getState() == true)) {
return dispatch(fetchOrders(username))
}
}
组件化简器 - reducer.js
import { REQUEST_ORDERS, RECEIVE_ORDERS } from './actions'
const INITIAL_STATE = {
orders: [],
}
function orders(state = INITIAL_STATE, action) {
switch(action.type) {
case REQUEST_ORDERS:
return Object.assign({}, state, {
...state,
})
case RECEIVE_ORDERS:
return Object.assign({}, state, {
...state,
orders: action.orders,
})
default:
return state
}
}
export default orders;
我的组件 - OrdersList.js
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import { connect } from 'react-redux'
import OrderCard from './OrderCard';
import { fetchOrdersIfNeeded } from './actions'
class OrdersList extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
const { dispatch } = this.props
dispatch(fetchOrdersIfNeeded("X"))
}
render() {
const { orders } = this.props;
const isEmpty = orders.length === 0
return (
isEmpty ?
<View>
<Text>Wishlist Empty!</Text>
</View>
:
this.props.orders.map((order) => (
<OrderCard key={order.OrderId.S} order={order} />
))
);
}
}
const mapStateToProps = (state) => {
const orders = state.ordersReducer.orders;
return {
orders
}
}
export default connect(mapStateToProps)(OrdersList);
store.js
import { createStore, applyMiddleware, combineReducers } from 'redux'
import thunk from 'redux-thunk'
import { createLogger } from 'redux-logger'
import wishlistReducer from '../components/WishlistGridList/reducer'
import ordersReducer from '../components/YourOrders/reducer'
const rootReducer = combineReducers({
wishlistReducer,
ordersReducer
})
const middleware = [ thunk ]
if (process.env.NODE_ENV !== 'production') {
middleware.push(createLogger())
}
const store = createStore(
rootReducer,
applyMiddleware(...middleware)
);
export default store;
解决方案
推荐阅读
- xml - 使用 xslt 合并/连接 xml 中属性的值
- json - 解析复杂的json而不用flutter键
- for-loop - 在 for 循环中多久计算一次条件?
- c# - 将存储库注入授权过滤器 C# .NET API
- c++ - 使用链表进行冒泡排序
- amazon-web-services - 如何在 terraform 中使用不同的子网和安全组创建 ec2 实例?
- javascript - scoll 时更改音乐按钮的文本阴影颜色
- aws-glue - 是否可以通过传递给 from_catalog 的 groupFiles 以编程方式创建动态框架?
- smt - 在 PySMT 中将 SMTLib 约束打印到标准输出
- typescript - 使用 mocha 和 sinon 的方法装饰器对函数进行单元测试