Ответ 1
Чтобы конкретно ответить на ваш вопрос: нормально встраивать презентационные и контейнерные компоненты. В конце концов, все они просто компоненты. Тем не менее, в интересах простого тестирования я предпочел бы разложить презентационные компоненты поверх компонентов контейнера. Все сводится к четкому структурированию ваших компонентов. Я нахожу, что запуск в одном файле, а затем медленный компонентный анализ работает хорошо.
Посмотрите на размещение детей и использование this.props.children
для переноса дочерних элементов в презентационный компонент.
Пример (удаленный код для краткости)
Список (презентационный компонент)
import React, { Component, PropTypes } from 'react';
export default class List extends Component {
static propTypes = {
children: PropTypes.node
}
render () {
return (
<div className="generic-list-markup">
{this.props.children} <----- wrapping all children
</div>
);
}
}
Todo (презентационный компонент)
import React, { Component, PropTypes } from 'react';
export default class Todo extends Component {
static propTypes = {
description: PropTypes.string.isRequired
}
render () {
return (
<div className="generic-list-markup">
{this.props.description}
</div>
);
}
}
TodoList (контейнерный компонент)
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import { createTodo, updateTodo, deleteTodo } from 'actions';
import List from 'components/List';
import Todo from 'components/Todo';
export class TodoList extends Component {
static propTypes = {
todos: PropTypes.array.isRequired,
create: PropTypes.func.isRequired
}
render () {
return (
<div>
<List> <---------- using our presentational component
{this.props.todos.map((todo, key) =>
<Todo key={key} description={todo.description} />)}
</List>
<a href="#" onClick={this.props.create}>Add Todo</a>
</div>
);
}
}
const stateToProps = state => ({
todos: state.todos
});
const dispatchToProps = dispatch = ({
create: () => dispatch(createTodo())
});
export default connect(stateToProps, dispatchToProps)(TodoList);
DashboardView (презентационный компонент)
import React, { Component } from 'react';
import TodoList from 'containers/TodoList';
export default class DashboardView extends Component {
render () {
return (
<div>
<TodoList />
</div>
);
}
};