mapStateToProps 将数据传递给道具

Posted

技术标签:

【中文标题】mapStateToProps 将数据传递给道具【英文标题】:mapStateToProps to passing data to props 【发布时间】:2018-11-04 16:39:38 【问题描述】:

我正在构建一个员工轮换系统,我有一个 mapStateToProps 函数,但是道具 rotaData 以未定义的形式返回 这是我的行动:

import settings from '../../aws-config.js';
import Amplify,  Auth, API  from 'aws-amplify';
export const GET_STAFF_SHIFTS = 'get_staff_shifts';
export function getShifts() 
console.log('Fetching list of shifts for user...');

const request = API.get("StaffAPI", "/shifts", 
headers: 
       'Accept': 'application/json',
       'Content-Type': 'application/json',
   
);
return 
  type : GET_STAFF_SHIFTS,
  payload : request
 

这是我的减速器

import _ from "lodash"
import  GET_STAFF_SHIFTS from '../actions';

export default function(state = , action) 
switch(action.type)
case GET_STAFF_SHIFTS:
    return  ...state, rotaData: action.payload.data ;
 

这是我的 mapStateToProps 函数

function mapStateToProps(state)
return rotaData: state.rotaData ;

export default connect(mapStateToProps, getShifts: getShifts) 
(StaffRota);

但是在我的 StaffRota 类中,当控制台记录 this.props 时,rotaData 返回 undefined。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

API.get() 是同步的,而是返回一个 Promise,因此您需要等待它完成,然后在加载完成时调度另一个动作。您需要安装redux-thunk 才能调度函数。

export const getShifts = () => dispatch => 
    const request = API.get("StaffAPI", "/shifts", 
        headers: 
               'Accept': 'application/json',
               'Content-Type': 'application/json',
        
    )
    .then(response => 
        dispatch(type: 'SHIFTS_LOAD_SUCCESS', response)
    )
    .catch(err => 
        dispatch(type: 'SHIFTS_LOAD_FAIL')
    )

然后您可以在包含响应的减速器中处理SHIFTS_LOAD_SUCCESS。然后在您的mapDispatchToProps 中,您可以将getShifts 函数作为道具提供给您的组件:

export default connect(mapStateToProps, dispatch => loadAllShifts: dispatch(getShifts()))(...)

【讨论】:

谢谢你,但是我得到一个错误,指出动作必须是普通对象。使用自定义中间件进行异步操作。 是的,您需要安装 redux-thunk 才能调度异步操作(链接上有关于如何将其添加为中间件的说明) 还有might be worth to read 不好意思问,但我不知道我要做什么?我已经安装了 redux thunk @SamuelGray 1. 更改您的getShifts 就像我上面的答案一样 2. 编写一个处理SHIFTS_LOAD_SUCCESS 的减速器并将其写入状态下的某个位置 3. 编写mapStateToProps 以提取来自状态的数据 4. 编写 mapDispatchToProps 以使您的 getShifts 可用作组件的 loadAllShifts 道具 5. 在组件中的某处调用 loadAllShifts。然后,您的组件将使用数据作为道具重新渲染。【参考方案2】:

API.get 返回一个Promise,因此您需要改用解析结果。

您还需要使用像 redux-thunk 这样的库来延迟操作的调度,直到 API 解析。

const getShifts = () => dispatch =>
  API.get(...).then(response => dispatch(
    type: GET_STAFF_SHIFTS,
    payload: response,
  ))

【讨论】:

以上是关于mapStateToProps 将数据传递给道具的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据传递给嵌套的子组件vue js?

Vue2将任意命名变量作为道具传递

如何将数据传递给BottomSheetDialogFragment [重复]

将数据传递给 viewController

将数据传递给服务 - android?

vue js将数据传递给组件