#javascript #reactjs #redux #react-redux
#javascript #reactjs #redux #реагировать-redux
Вопрос:
У меня есть три компонента, которые встроены друг в друга, и все они должны быть подключены к редукторам с одинаковыми действиями. Кажется, я нашел только примеры, когда в определенном контейнере файлы, в которых только один из компонентов передается через функцию connect.
Как я могу это сделать?
Вот мой текущий код, хотя не уверен, что это необходимо:
//need HelpMenu2 and HelpMenu3 to be passed through as well.
export default connect( mapStateToProps, matchDispatchToProps)(HelpMenu1);
Edit: As requested, here is the code:
class HelpMenu extends Component{
render(){
var me=this;
var api ="https://api.someapi.com/";
return(
<ul>
<div >Click here to test</div><br/>
{this.state.allTopics.map(function (helpTopics, key) {
return (
<ul key={key}>
<li>
<div onClick={()=>me.props.fetchHelpTopics(api)}>
{helpTopics.id}
</div>
<ul>
{helpTopics.isExpanded ? <SubMenu2 helpTopics={helpTopics} isLastExpanded={false}/> : null}
</ul>
</li>
</ul>
);
})}
</ul>
);
}
}
class SubMenu extends Component{
render(){
var me =this;
var api ="https://api.someapi.com/";
return (
<div>
{this.props.helpTopics.subtopics.map(function (helpSubtopics, key) {
return (
<ul key={key}>
<li>
<div onClick={()=>me.props.fetchHelpTopics(api)}>
{helpSubtopics.id}</div>
{helpSubtopics.isExpanded ? <LastSubMenu helpSubtopics={ helpSubtopics}/> : null}
</li>
</ul>
);
})}
</div>
);
}
}
class LastSubMenu extends Component{
render(){
var me=this;
var api ="https://api.someapi.com/";
return(
<div>
{this.props.helpSubtopics.subtopics
.map(function (helpSubSubtopics, key) {
return (
<ul key={key}>
<li>
<div
onClick={me.onTopicClick.bind(me, helpSubSubtopics)}>
<div onClick={()=>me.props.fetchHelpTopics(api)}>
{helpSubSubtopics.title}
</div>
</div>
</li>
</ul>
);
})}
</div>
);
}
}
События будут происходить там, где есть onClick на теге.
Редактировать: мой код подключения:
export default connect( mapStateToProps, matchDispatchToProps)(HelpMenu);
Как бы я сделал для этого несколько вызовов? Насколько я понимаю, вы можете использовать только export default
один раз для каждого файла,
итак, я сделал это:
export default connect( mapStateToProps, matchDispatchToProps)(HelpMenu);
connect( mapStateToProps, matchDispatchToProps)(SubMenu2);
connect( mapStateToProps, matchDispatchToProps)(LastSubMenu);
Который не работает.
Комментарии:
1. можете ли вы показать, как ваши компоненты встроены друг в друга?
2. Это не совсем красиво… По сути, это один список, встроенный в другой, но я добавлю правку с кодом.
Ответ №1:
Вызовите connect еще раз для других компонентов.
Вам нужно экспортировать возвращаемое значение из каждого вызова метода отдельно. в ES6 это может выглядеть примерно так. (возможно, вам потребуется поискать, какой синтаксис работает с вашей настройкой js)
export const first = connect( mapStateToProps, matchDispatchToProps)(HelpMenu);
export const second = connect( mapStateToProps, matchDispatchToProps)(SubMenu2);
export const third = connect( mapStateToProps, matchDispatchToProps)(LastSubMenu);
Затем получите к ним доступ отдельно в компоненте, который их отображает.
Комментарии:
1. пробовал. Не работает. Он просто игнорирует другие вызовы.
2. Вы можете вызвать connect несколько раз. Вероятно, вам нужно показать больше кода, чтобы сделать проблему более понятной.
3. Возможно, у меня просто какое-то недопонимание, и я все еще новичок в этом. Я добавил код, который я пробовал, и почему я попробовал это именно так, так что извините, если я ошибаюсь. Но как я мог бы это сделать, чтобы заставить его работать?
4. нет проблем, смотрите Мой отредактированный ответ. Это была просто проблема с синтаксисом javascript. В Mozilla есть несколько хороших ресурсов для ознакомления с синтаксисом. Я также настоятельно рекомендую руководство Дэна Абрамова, чтобы помочь вам разобраться, как это работает с redux: egghead.io/courses/getting-started-with-redux Он создал redux, поэтому он знает, о чем говорит 🙂
5. Обновление: Я идиот, все, что мне нужно было сделать, это использовать const вместо самих компонентов 🙂