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组件和容器组件的拆分 及 无状态组件的更多相关文章

  1. React系列文章:无状态组件生成真实DOM结点

    在上一篇文章中,我们总结并模拟了JSX生成真实DOM结点的过程,今天接着来介绍一下无状态组件的生成过程. 先以下面一段简单的代码举例: const Greeting = function ({name ...

  2. React中的高阶组件,无状态组件,PureComponent

    1. 高阶组件 React中的高阶组件是一个函数,不是一个组件. 函数的入参有一个React组件和一些参数,返回值是一个包装后的React组件.相当于将输入的React组件进行了一些增强.React的 ...

  3. React: 无状态组件生成真实DOM结点

    在上一篇文章中,我们总结并模拟了 JSX 生成真实 DOM 结点的过程,今天接着来介绍一下无状态组件的生成过程. 先以下面一段简单的代码举例: const Greeting = function ({ ...

  4. React 中的 Component、PureComponent、无状态组件 之间的比较

    React 中的 Component.PureComponent.无状态组件之间的比较 table th:first-of-type { width: 150px; } 组件类型 说明 React.c ...

  5. react的redux无状态组件

    Provider功能主要为以下两点: 在原应用组件上包裹一层,使原来整个应用成为Provider的子组件 接收Redux的store作为props,通过context对象传递给子孙组件上的connec ...

  6. Blazor中的无状态组件

    声明:本文将RenderFragment称之为组件DOM树或者是组件DOM节点,将*.razor称之为组件. 1. 什么是无状态组件 如果了解React,那就应该清楚,React中存在着一种组件,它只 ...

  7. Flutter入门之无状态组件

    Flutter核心理念 flutter组件采用函数式响应框架构建,它的灵感来自于React.它设计的核心思想是组件外构建UI,简单解释一下就是组件鉴于它当前的配置和状态来描述它的视图应该是怎样的,当组 ...

  8. 37行代码构建无状态组件通信工具-让恼人的Vuex和Redux滚蛋吧!

    状态管理的现状 很多前端开发者认为,Vuex和Redux是用来解决组件间状态通信问题的,所以大部分人仅仅是用于达到状态共享的目的.但是通常Redux是用于解决工程性问题的,用于分离业务与视图,让结构更 ...

  9. StatelessWidget 无状态组件 StatefulWidget 有状态组件 页面上绑定数据、改变页面数据

    一.Flutter 中自定义有状态组件 在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget. StatelessWidget ...

随机推荐

  1. Day2-C-迷宫问题 -POJ3984

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  2. JuJu团队12月29号工作汇报

    JuJu团队12月29号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 飞飞 数据处理 待安排 无 婷婷 调试代码 提升acc 无 恩升 修正evaluate 待完成 无 金华 ...

  3. swoole之建立 http server

    一.代码部分 <?php /** * 传统:nginx <-> php-fpm(fast-cgi process manager) <-> php * swoole:ht ...

  4. 在线关闭 CLOSE_WAIT状态TCP连接

    1.查看某个端口的所有TCP连接: [root@Centos projects]# netstat -anp | tcp6 ::: :::* LISTEN /java tcp6 CLOSE_WAIT ...

  5. Liveness 探测【转】

    Liveness 探测让用户可以自定义判断容器是否健康的条件.如果探测失败,Kubernetes 就会重启容器. 还是举例说明,创建如下 Pod: 启动进程首先创建文件 /tmp/healthy,30 ...

  6. Ubuntu 19.10将使用GCC 9作为默认编译器

    作为我们这一周期一直期待的变化,Ubuntu 19.10升级到GCC 9作为GCC 8的默认系统编译器. Ubuntu 19.10(和Ubuntu 20.04 LTS)将使用GCC 9 stable作 ...

  7. PAN3501与AS3933完美兼容替代

    现在不少校园门禁卡都是采用奥地利的AS3933,市场需求是供不应求,当然价格上还是不断上升趋势.成本上压力也是越来越大,不少厂家在寻找能替代软硬件兼容AS3933的芯片方案.今天我就为大家介绍一款能否 ...

  8. 2019 OI日记

    //  我觉得记日记是个好习惯吧 毕竟指不定哪天就学不下去了 就AFO了 就没有梦了   // [置顶]活跃于你谷普及训练场.ybt(没底气说全部).loj(提高基础部分)  //优先级从前往后 因为 ...

  9. 我的Grunt之旅-序章

    时间:2018-03-05 13:52  事件:安装Grunt 相关网址: grunt官网:https://gruntjs.com node.js下载地址 :https://nodejs.org/en ...

  10. JVM:Java 类的加载机制

    虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 类的生命周期 类从被加载到虚拟机内 ...