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 ...
随机推荐
- 3(计算机网络)ifconfig:最熟悉又陌生的命令行
当面试听到这个问题的时候,面试者常常会觉得走错了房间.我面试的是技术岗位啊,怎么问这么简单的问题? 的确,即便没有专业学过计算机的人,只要倒腾过电脑,重装过系统,大多也会知道这个问题的答案:在 Win ...
- Spring任务调度实战之Quartz Cron Trigger
在Quartz中除了使用最简单的Simple Trigger以外,也可以使用类似Linux上Cron作业的CronTrigger的方式来运行Job,下面是一个小例子: 1. 首先是一个任务类,这个类没 ...
- AOP五种执行时机
动态代理四种增强方式 先创建一个service类 package com.zzj.calculatar.service; import org.springframework.stereotype.S ...
- NSQ学习记录
一.简介 NSQ是一个基于Go语言的开源的分布式实时消息平台,他的代码托管在GitHub上. NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架 ...
- JMeter学习-图形化 HTML 报表概要说明
JMeter 3.0开始支持动态生成图形化 HTML dashboard报告,当前生成报告有一下两种方式: 1.脚本测试执行结束后,即生成HTML测试报告 2.通过之前生成的测试结果,生成HTML测试 ...
- is application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem
最近试着了解 c++,接触到了QT,写了一个测试程序,在开发环境下正常后移到非开发环境,报错 网上找资料说是少了platforms文件夹中的dll,把里面所有的dll复制到执行程序目录,还是提示,继续 ...
- 61 C项目------家庭收支软件
1,目标: ①模拟实现一个基于文本界面的<家庭收支软件> ②涉及知识点 局部变量和基本数据类型 循环语句 分支语句 简单的屏幕输出格式控制 2,需求说明: ①模拟实现基于文本界面的< ...
- 动态设置html根字体大小(随着设备屏幕的大小而变化,从而实现响应式)
代码如下:如果设置了根字体大小,font-size必须是rem var html =document.querySelector('html'); html.style.fontSize = docu ...
- 009-PHP循环输出数组成员
<?php $Cities[] = "<B>北京</B>"; //等同于$Cities[0] = "北京" $Cities[] = ...
- Java 定时循环运行程序
Timer 和 ScheduledExecutorSeruvce 都能执行定时的循环任务,有函数 scheduleAtFixedRate.但是,如果任务运行时间较长,超过了一个周期时长,下一个任务就会 ...