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 ...
随机推荐
- ABC154 E - Almost Everywhere Zero
数位DP模板,记忆化+限制即可 #include<bits/stdc++.h> using namespace std; #define lowbit(x) ((x)&(-x)) ...
- hue中访问hdfs报错
在hue中访问hdfs报错: Cannot access: /. Note: you are a Hue admin but not a HDFS superuser, "hdfs" ...
- 【pwnable.tw】 seethefile
一开始特别懵的一道题. main函数中一共4个功能,openfile.readfile.writefile.closefile. 其中,在最后退出时有一个明显的溢出,是scanf("%s&q ...
- 卸载重装ngin的问题解决方案
1,卸载nginx不保留配置文件 $ sudo apt-get --purge remove nginx 2,卸载自动安装且不再需要的依赖包 $ sudo apt-get autoremove 3,卸 ...
- php二位数组排序(按子元素排序)
array_multisort(array_column($mainTree[$note]["beCalls"], "wtp"), SORT_DESC, arr ...
- 使用JS写一个计算器
先上效果图: 简单的加减乘除功能还是有的,所以我们就考虑怎么来实现这个功能. 根据预期效果,可以确定页面中的布局要用到table tr td. 所以先放上页面布局,table的边框宽度border,c ...
- python 字典复制(存疑)
import copy x = {'a':1,'b':[2,3,4]} y = x.copy() z = copy.deepcopy(x) print(x) print(y) print(z) pri ...
- 005、Java中使用文档注释
01. 代码如下: package TIANPAN; /** * 此处为文档注释 * @author 田攀 微信382477247 */ public class TestDemo { public ...
- docker安装centos7镜像
拉取centos7镜像[root@localhost ~]# docker pull centos:71启动镜像centos7,如果不指定 /bin/bash,容器运行后会自动停止[root@loca ...
- apache端口修改为80
apache端口莫名改变为443,访问网址失败,修改Apache端口: 1.打开目录(实际而定): C:\xampp\apache\conf 编辑httpd.conf 2.ctrl + f 搜索li ...