Как использовать mapStateToProps для получения значения из состояния на основе значения контекста?

#reactjs #react-redux #react-context

Вопрос:

У меня есть приложение, когда большая часть данных хранится в магазине, но выбранный элемент предоставляется при использовании React.Контекст.

React-Redux предоставляет connect api, который принимает mapStateToProps функцию с state компонентом и props в качестве компонента.

Чего бы я хотел, если бы это не сломало крючки, так это что-то вроде:

 function mapStateToProps(state){
  const selectedItemId = useContext(MySelectedItemContext)
  return {
    item: state.items[selectedItemId]
  }
}
 

но, конечно, это невозможно, так как я нахожусь вне компонента и не могу вызвать useContext.

Итак, я попытался использовать старый контекст API:

 function mapStateToProps(state, props){
  return {
    item: state.items[props.id]
  }
}
export default connect(mapStateToProps)((props) =>
  <MySelectedItemContext.Consumer>
  { selectedItemId => <Component id={selectedItemId} {...props}/> }
  </MySelectedItemContext.Consumer>)
 

но это все равно не работает, потому что connect возвращает новый компонент, в котором потребитель находится внутри, а не снаружи, а идентификатор prop еще не определен в mapStateToProps.

Есть идеи?

Ответ №1:

Лучший способ-удалить mapStateToProps и использовать useSelector хуки и селекторы Redux. Но если вам нужно mapStateToProps , вы можете обернуть свой компонент, который должен быть подключен к Redux, в другой компонент, который получит значение из контекста и передаст его компоненту, использующему Redux.

 // Use this component
export function ContextConsumerComponent() {
  const selectedItemId = useContext(SelectedItemIdContext);

  return <ReduxConsumerComponent id={selectedItemId} />;
}

function mapStateToProps(state, props) {
  return {
    item: state.items[props.id]
  }
}

const ReduxConsumerComponent = connect(mapStateToProps)((props) => {
  // props.item will be here
});