gpt4 book ai didi

reactjs - 将容器组件嵌套在演示组件中

转载 作者:行者123 更新时间:2023-12-03 13:02:45 25 4
gpt4 key购买 nike

我正在尝试重构我的应用程序以分离演示组件和容器组件。我的容器组件只是包装在 connect() 中的演示组件来自react-redux的调用,它将状态和 Action 创建者映射到展示组件的 Prop 。

todo-list.container.js

import React, {Component} from 'react';
import {connect} from 'react-redux';

import {fetchTodos} from '../actions/todo.actions';
import TodoList from '../components/todo-list.component';

export default connect(({todo}) => ({state: {todo}}), {fetchTodos})(TodoList);

todo-list.component.jsx

import React, {Component} from 'react';

import TodoContainer from '../containers/todo.container';

export default class TodoList extends Component {
componentDidMount () {
this.props.fetchTodos();
}

render () {
const todoState = this.props.state.todo;

return (
<ul className="list-unstyled todo-list">
{todoState.order.map(id => {
const todo = todoState.todos[id];
return <li key={todo.id}><TodoContainer todo={todo} /></li>;
})}
</ul>
);
}
};

todo.container.js

import React, {Component} from 'react';
import {connect} from 'react-redux';

import {createTodo, updateTodo, deleteTodo} from '../actions/todo.actions';
import Todo from '../components/todo.component';

export default connect(null, {createTodo, updateTodo, deleteTodo})(Todo);

todo.component.jsx

import React, {Component} from 'react';

import '../styles/todo.component.css';

export default class Todo extends Component {
render () {
return (
<div className="todo">
{todo.description}
</div>
);
}
};

我想弄清楚的是:我知道我不应该嵌入 <TodoContainer /> TodoList 内的元素因为TodoList是一个演示组件,它应该只在其中嵌套其他演示组件。但如果我用 <Todo /> 替换它演示组件,然后我必须映射 TodoListContainer 中的每个状态 Prop 和 Action 创建者 Prop 那Todo组件需要将它们作为 props 手动传递到链上。当然,这是我想要避免的事情,尤其是当我开始嵌套更多级别或开始依赖来自 Redux 的更多 props 时。

我的做法正确吗?看来我一般不应该尝试将容器组件嵌入到演示组件中,因为如果我可以将演示组件与 Redux 解耦,它们就会变得更加可重用。同时,我不知道如何将需要访问 Redux 状态/调度的组件嵌入到具有标记的任何其他组件中。

最佳答案

具体回答您的问题:嵌套演示组件和容器组件是可以的。毕竟,它们都只是组件。然而,为了便于测试,我更喜欢嵌套演示组件而不是容器组件。这一切都取决于组件的清晰结构。我发现从单个文件开始然后慢慢组件化效果很好。

看看嵌套子元素并利用 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>
);
}
};

关于reactjs - 将容器组件嵌套在演示组件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39845866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com