15. react UI组件和容器组件的拆分 及 无状态组件
1.组件的拆分
组件拆分的前提
当所有的逻辑都出现在一个组件内时
组件会变得非常复杂 不便与代码的维护
所以对组件进行拆分
IU组件 进行页面渲染
容器组件 进行逻辑操作
UI组件的拆分
新建一个 TodoListUI.js 将 TodoList 组件的 render 方法进行拆分封装为 UI 组件
其余的 TodoList 组件为 容器组件
# TodoListUI.js
import React, { Component } from 'react';
import 'antd/dist/antd.css';
import { Button , Input, List } from 'antd';
class TodoListUI extends Component{
render(){
return (
<div style={{paddingTop:'10px', paddingLeft : '10px'}}>
<div>
<Input style={{width: '300px', marginRight: '10px'}} onChange={this.props.getInputValue} placeholder='请输入'/>
<Button type="primary" onClick={this.props.addItem}>提交</Button>
</div>
<div>
<List
style={{width: '300px', marginTop: '10px'}}
bordered
dataSource={this.props.list}
renderItem={(item, key) => <List.Item index={key} onClick={this.props.delItem}>{item}</List.Item>}
/>
</div>
</div>
);
}
}
export default TodoListUI;
# TodoList.js
import React , {Component} from 'react';
import store from './store';
import TodoListUI from './TodoListUI';
class TodoList extends Component
{
constructor(props){
super(props);
this.state = store.getState();
this.addItem = this.addItem.bind(this);
this.delItem = this.delItem.bind(this);
this.getReduxState = this.getReduxState.bind(this);
this.getInputValue = this.getInputValue.bind(this);
store.subscribe(this.getReduxState);
}
getReduxState(){
this.setState(store.getState());
}
getInputValue(e){
const action = {
type : 'input_value_change',
value : e.target.value
}
store.dispatch(action);
}
addItem(){
const action = {
type : 'add_item',
value : this.state.inputValue
}
store.dispatch(action);
}
delItem(e){
const action = {
type : 'del_item',
value : e.target.getAttribute('index')
}
store.dispatch(action);
}
render(){
return (
<TodoListUI
getInputValue={this.getInputValue}
addItem={this.addItem}
delItem={this.delItem}
list={this.state.list}
/>
);
}
}
export default TodoList;
2. 无状态组件
当一个组件只有一个 render 函数的时候 便可以用一个无状态组件替换普通的组件
无状态组件的 性能比较高
无状态组件就是一个函数
不需要执行类似于类一样的钩子函数
将 TodoListUI.js 写成无状态组件
# TodoList.js
import React from 'react';
import 'antd/dist/antd.css';
import { Button , Input, List } from 'antd';
const TodoListUI = (props)=>{
return (
<div style={{paddingTop:'10px', paddingLeft : '10px'}}>
<div>
<Input style={{width: '300px', marginRight: '10px'}} onChange={props.getInputValue} placeholder='请输入'/>
<Button type="primary" onClick={props.addItem}>提交</Button>
</div>
<div>
<List
style={{width: '300px', marginTop: '10px'}}
bordered
dataSource={props.list}
renderItem={(item, key) => <List.Item index={key} onClick={props.delItem}>{item}</List.Item>}
/>
</div>
</div>
)
}
export default TodoListUI;
15. react UI组件和容器组件的拆分 及 无状态组件的更多相关文章
- React系列文章:无状态组件生成真实DOM结点
在上一篇文章中,我们总结并模拟了JSX生成真实DOM结点的过程,今天接着来介绍一下无状态组件的生成过程. 先以下面一段简单的代码举例: const Greeting = function ({name ...
- React中的高阶组件,无状态组件,PureComponent
1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...
- React: 无状态组件生成真实DOM结点
在上一篇文章中,我们总结并模拟了 JSX 生成真实 DOM 结点的过程,今天接着来介绍一下无状态组件的生成过程. 先以下面一段简单的代码举例: const Greeting = function ({ ...
- React 中的 Component、PureComponent、无状态组件 之间的比较
React 中的 Component.PureComponent.无状态组件之间的比较 table th:first-of-type { width: 150px; } 组件类型 说明 React.c ...
- react的redux无状态组件
Provider功能主要为以下两点: 在原应用组件上包裹一层,使原来整个应用成为Provider的子组件 接收Redux的store作为props,通过context对象传递给子孙组件上的connec ...
- Blazor中的无状态组件
声明:本文将RenderFragment称之为组件DOM树或者是组件DOM节点,将*.razor称之为组件. 1. 什么是无状态组件 如果了解React,那就应该清楚,React中存在着一种组件,它只 ...
- Flutter入门之无状态组件
Flutter核心理念 flutter组件采用函数式响应框架构建,它的灵感来自于React.它设计的核心思想是组件外构建UI,简单解释一下就是组件鉴于它当前的配置和状态来描述它的视图应该是怎样的,当组 ...
- 37行代码构建无状态组件通信工具-让恼人的Vuex和Redux滚蛋吧!
状态管理的现状 很多前端开发者认为,Vuex和Redux是用来解决组件间状态通信问题的,所以大部分人仅仅是用于达到状态共享的目的.但是通常Redux是用于解决工程性问题的,用于分离业务与视图,让结构更 ...
- StatelessWidget 无状态组件 StatefulWidget 有状态组件 页面上绑定数据、改变页面数据
一.Flutter 中自定义有状态组件 在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget. StatelessWidget ...
随机推荐
- 前端学习笔记系列一:15vscode汉化、快速复制行、网页背景图有效设置、 dl~dt~dd标签使用
ctrl+shift+p,调出configure display language,选择en或zh,若没有则选择安装使用其它语言,则直接呼出扩展程序搜索界面,选择,然后安装,重启即可. shift+a ...
- php面向对象的三大特性——封装、继承、多态
1.封装 目的:为了使类更加安全,类里面的成员变量对外界隐藏 做法: 1)将成员变量变成私有的: 2)在类中做方法间接访问成员变量: 3)在方法里面加控制条件. 例: class ren{ priva ...
- Git如何合并Commit
如果你在 push 你的修改之前想要将本地多次修改后的 commit 合并一下变得更好看,可以使用下面的方法. 指定你要合并的 commit 相关的命令有两种 你可以通过指定修改过去的几个 commi ...
- 如何关闭 Mac OS X EI Capitan 系统文件保护
在修改 Mac OS X EI Capitan 系统的某些系统文件的过程中,你可能会遇到即使你加了 sudo 以管理员身份去操作页会被拒绝, 这是一个名为 SIP(System Integrity P ...
- loadrunner11完整卸载
1.在控制面板中卸载掉loadrunner11的程序 2.删除loadrunner11安装目录 3.删除C盘(和安装目录下) wlrun.*和vugen.* 4.删除回收站 5.清除注册表(运行r ...
- swagger获取
参考 https://www.jianshu.com/p/840320d431a1 https://www.cnblogs.com/luoluocaihong/p/7106276.html
- R 正态性检验:正态概率图
检验模型是否满足正态性假设的方法: 1.正态概率图 这是我编写的画正态概率图的函数: #绘制正态概率图 plot_ZP = function(ti) #输入外部学生化残差 { n = length(t ...
- Day6 - H - Balanced Lineup POJ - 3264
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One d ...
- eshop1-大型电商架构演进
1. 项目初期 2. 服务器分离 以上的服务分离架构,即使文件服务crash 了,但是application server 和 Database Server 继续可以访问运行 3. 基于并发访问越来 ...
- JS: 子项可以来回交换的两个下拉列表
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...