我正在尝试重构我的应用程序以分离表示和容器组件。我的容器组件只是包装在connect()
react-
redux调用中的表示性组件,这些调用将状态和动作创建者映射到表示性组件的props。
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
因为该Todo
组件将需要并将它们作为道具手动传递给整个链。当然,这是我要避免的事情,尤其是当我开始嵌套更多的关卡或开始依赖Redux的更多道具时。
我正确地解决了吗?似乎我一般不应该尝试将容器组件嵌入表示性组件内,因为如果我可以将表示性组件与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>
);
}
}
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>
);
}
}
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);
import React, { Component } from 'react';
import TodoList from 'containers/TodoList';
export default class DashboardView extends Component {
render () {
return (
<div>
<TodoList />
</div>
);
}
};
问题内容: 我是redux反应开发的初学者。我想知道什么是演示组件和容器组件。 如何将组件分类为Presentational或Container? 两者有什么区别? 这样对组件进行分类有什么好处? 问题答案: 您会发现您的组件更容易重用,并考虑将它们分为两类。我称它们为容器和演示组件。 我假设您已经了解Redux架构 容器组件 意识到redux 订阅Redux状态 派遣到redux动作 由reac
问题描述 UI和业务逻辑和数据混杂在一起. class Clock extends React.Component { constructor(props) { super(props); this.state = {time: this.props.time}; this._update = this._updateTime.bind(this); } ren
本文向大家介绍React中嵌套组件与被嵌套组件的通信过程,包括了React中嵌套组件与被嵌套组件的通信过程的使用技巧和注意事项,需要的朋友参考一下 前言 在React项目的开发中经常会遇到这样一个场景:嵌套组件与被嵌套组件的通信。 比如Tab组件啊,或者下拉框组件。 场景 这里应用一个最简单的Tab组件来呈现这个场景。 这里有Tab,TabItem和Area三个组件,其中Tab为嵌套组件,TabI
我是新来的。我试图用它来建立自己的网站。我想做的是在父组件中嵌套一个子组件;父组件应该在主页中呈现,子组件嵌套在主页中。下面我举了一个我尝试的例子。 到目前为止,我的方法是 在“childComponent”中创建子组件。js' 这里的问题是“childComponent”在我的React应用程序中永远不可见。我是不是走错了路?有没有我不懂的基本机械原理? 提前感谢!! -- 子组件(childC
嗨,我是ReactJS平台的学生开发者。我以前在render方法中使用过类组件,但现在我学习了钩子和函数组件对它的重要性,就像每个Reactjs开发人员所知道的那样。我在使用嵌套组件时遇到问题,我面临如下错误: index.js:1警告:函数作为React子函数无效。如果返回组件而不是从渲染返回组件,可能会发生这种情况。或者你想调用这个函数而不是返回它 你能帮我解决这个问题吗?如何在返回部分有效地
本文向大家介绍展示组件和容器组件有什么区别?相关面试题,主要包含被问及展示组件和容器组件有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 展示组件(Presentational Component) 关注页面的展示效果(外观) 内部可以包含展示组件和容器组件,通常会包含一些自己的DOM标记和样式(style) 通常允许通过this.props.children方式来包含其他组件。 对应用程序
主要内容:什么是AWT 容器组件,常见的AWT 容器组件什么是AWT 容器组件 Container 容器是 AWT GUI 组件的组成部分。容器提供了一个可以放置组件的空间。AWT 中的容器本身就是一个组件,它增加了向自身添加组件的能力。以下是需要考虑的值得注意的点。 Container 的子类称为 Container。例如面板、框架和窗口。 Container 只能向自身添加 Component。 每个容器中都有一个默认布局,可以使用 setLayo
我的应用程序目前分为3个部分: 前端 行政 错误 前端、管理和错误组件有自己的样式。 前端和管理组件也有自己的交换机组件来导航。 我面临的问题是,如果没有重定向组件,我就不能命中NoMatch路径。但是当我这样做的时候,我失去了浏览器URL中的错误路径。 当内部交换机组件没有在其父交换机组件中持续搜索的匹配路由时,是否有可能? 然后我就可以点击NoMatch路线,并在URL中保留错误的路径。 编辑