0

尝试<button>在调度已为异步进程设置的 redux-thunk 函数时使用组件中的道具,但我无法完全了解如何同时使用道具和函数(通过 react-redux 连接到组件connectmapDispatchToProps) 但我就是不知道如何同时调用道具和函数。

function loadData(dispatch, medium) {
    console.log(dispatch)
    return dispatch({type: 'LOADING_COMPONENT'})

  return axios.get(`/professionals/${medium}`)
    .then(res => res.json())
    .then(
      data => dispatch({ type: 'LOAD_SOME_DATA_SUCCESS', data }),
      err => dispatch({ type: 'LOAD_SOME_DATA_FAILURE', err })
    );
}

const mapDispatchToProps = (dispatch) => {
  return {
    LogInClick : () => dispatch(loadData()),
  }
}


const LoginButtons = ({props, LogInClick}) => (
    <button onClick={() => LogInClick(props.medium)} type="button">{props.buttonName}</button>
)


const LoginConnect = connect(null, mapDispatchToProps)(LoginButtons)

然后我导出它并尝试调用它,以便它可以在渲染文件中重用,例如

<LoginConnect medium='suhhhh' buttonName='To log in to suhhh'/>
4

2 回答 2

1
function loadData(dispatch, medium) {
    console.log(dispatch)
    return dispatch({type: 'LOADING_COMPONENT'})

  return axios.get(`/professionals/${medium}`)
    .then(res => res.json())
    .then(
      data => dispatch({ type: 'LOAD_SOME_DATA_SUCCESS', data }),
      err => dispatch({ type: 'LOAD_SOME_DATA_FAILURE', err })
    );
}

const mapDispatchToProps = (dispatch) => {
  return {
    LogInClick : () => dispatch(loadData()),
  }
}


const LoginButtons = ({medium, buttonName, LogInClick}) => (
    <button onClick={() => LogInClick(medium)} type="button">{buttonName}</button>
)


const LoginConnect = connect(null, mapDispatchToProps)(LoginButtons)

这应该工作!实际上 connect 将 mapStateToProps、mapDispatchToProps 合并到 this.props 中。阅读此文档以更好地理解https://github.com/reactjs/react-redux/blob/master/docs/api.md

于 2017-12-05T21:10:25.757 回答
0

尝试返回一个函数,然后redux-thunk将使用dispatch作为参数调用该函数。

然后,您可以从该返回的函数调用调度:

function loadData(medium) {
  return (dispatch) => {
    dispatch({ type: 'LOADING_COMPONENT' })

    axios.get(`/professionals/${medium}`)
      .then(res => res.json())
      .then(
        data => dispatch({ type: 'LOAD_SOME_DATA_SUCCESS', data }),
        err => dispatch({ type: 'LOAD_SOME_DATA_FAILURE', err })
      )
  }
}

然后,您的LogInClick函数可以接受一个可以传递给loadData的参数:

const mapDispatchToProps = (dispatch) => {
  return {
    LogInClick: (medium) => dispatch(loadData(medium)),
  }
}

const LoginButtons = (props) => (
  <button onClick={() => props.LogInClick(props.medium)} type="button">{props.buttonName}</button>
)

我希望这有帮助。

于 2017-12-05T21:08:54.987 回答