react学习 - 组件化开发组件化开发 把页面逻辑拆分成一个一个小的组件,然后整合成一个大的页面,形成一个大的组件树, -天下标王
稀土掘金 稀土掘金
秃头小吴
29 阅读4分钟

组件化开发

把页面逻辑拆分成一个一个小的组件,然后整合成一个大的页面,形成一个大的组件树,每一个组件都是一个小的模块。 对于一些重复使用的逻辑我们也可以拆分成组件,减少代码量

react的组件化划分

  1. 函数式组件 Functional Component
  2. 类组件 Class Comoonent
  3. 无状态组件(Stateless Component)和有状态组件(Stateful Component)
  4. 展示型组件 (Persenration Component)和容器型组件(Container Component)

一般情况下函数式组件是无状态组件,类组件认为是有状态组件

类组件要求

  • 名称必须大写开头
  • 需要继承React.Component
  • 必须实现render函数

代码

import React from "react";

class App extends React.Component {
    constructor (){
        super() // 因为有继承得调用super()
        this.state  ={
            title:"hello world"
        }
    }
    
    render() {
        const {title} = this.state
        return (
            <div>
                {title}
            </div>
        );
    }
}


export default App

render函数返回值

第一次渲染的时候必然会被调用一次,当它被调用时,会检查this.props 和this.state的变化并返回以下类型

  1. react元素
  2. 数组或fragments
  3. Portals:可以渲染子节点到不同的dom树中
  4. 字符串/数字类型

函数式组件特点

  1. 返回值和类组件render一样
  2. 没有生命周期
  3. 没有this关键字指向组件实例
  4. 没有内部状态(state)

组件的生命周期

万物皆可周期

阶段

  1. 挂载阶段Mount:组件第一次在dom树中被渲染的过程
  2. 更新阶段Update:组件状态发生改变,重新渲染更新的过程
  3. 卸载阶段Unmount:组件从dom树种被移除的过程

react生命周期

  1. componentDidMount 挂载到dom上时回调 网络请求最好的地方,可以添加一些订阅,需销毁时取消订阅
  2. componentDidUpdate 组件发生跟新时回调
  3. componentWillUnmount 组件即将被移除时回调

6eee98149fbfef0363dae25eed23cc1.png

组件之间的通信

父传子 props

父组件
...
export class index extends Component {
    constructor() {
        super()
        this.state = {
            title: "标题"
        }
    }
    render() {
        const { title } = this.state
        return (
            <div>
                <Header title={title} />
                <Main />
                <Footer />
            </div>
        )
    }
}
...
子组件
...
import React, { Component } from 'react'
import PropTypes from 'prop-types';

export class Header extends Component {
    constructor(props) {
        super(props)
        this.state = {
            message: "hello component"
        }
    }
    render() {
        const { message } = this.state
        const { title,age } = this.props
        return (
            <div>
                <h1>{message}</h1>
                <h1> {title}</h1>
                <h2>{age}</h2>
            </div>
        )
    }
}
Header.propTypes = {
    title: PropTypes.string.isRequired,
    age:PropTypes.number
}
Header.defaultProps = {
    title:"default title",
    age:18
}
export default Header
...

子传父

父
...
  changeCount(count) {
        this.setState({
            count: count
        })
    }
    render() {
        const {count} = this.state
        return (
            <div>
                <h1>app count:{count}</h1>
                <Footer addClick={(count) => this.changeCount(count)} />
            </div>
        )
    }
    ...
    
 子
 ...
  increment() {
    this.setState({
      count: this.state.count + 1
    })
    this.props.addClick(this.state.count)
  }
 ...

组件插槽的用法

组件的children实现

每个组件都可以包含children的内容 如果只有一个内容时,不是数组的形式传递,children本身就是传递的内容

父
...
 <NavBar>
           <p>插入left的内容</p>
           <p>插入center的内容</p>
           <p>插入right的内容</p>
 </NavBar>
 ...
 子
 ...
  render() {
        const { children } = this.props
        return (
            <div className='navbar'>
                <div className="left">
                    {children[0]}
                </div>
                <div className="center"> {children[1]}</div>
                <div className="right"> {children[2]}</div>
            </div>
        )
    }
 ...

props 属性传递

父
...
<NavBar2 
          leftSlot={<p>left 内容</p>}
          rightSlot={<p>rIght 内容</p>}
        />
...
子
...
 render() {
        const { leftSlot, rightSlot } = this.props
        return (
            <div className='navbar'>
                <div className="left">
                    {leftSlot}
                </div>
                <div className="center"> center</div>
                <div className="right">
                    {rightSlot}</div>
            </div>
        )
    }
...

组件非父子通信 Context

Context提供来一种在组件之间共享数据的方式,而不必层层传递

theme-context.js
import React from "react";

const ThemeContext = React.createContext()

export default ThemeContext

传递数据
...
import React, { Component } from 'react'
import Home from './Home'
import ThemeContext from './context/theme-context'

export class App extends Component {
    constructor() {
        super()
        this.state = {
            info: { name: 'kobe', age: 18 }
        }
    }
    render() {
        const { info } = this.state
        return (
            <div>
                {/* 给home传递数据 */}
                {/* <Home {...info}/> */}
                <ThemeContext.Provider value={info}>
                    <Home></Home>
                </ThemeContext.Provider>
            </div>
        )
    }
}

export default App
...

使用数据
...
import React, { Component } from 'react'
import ThemeContext from './context/theme-context'

export class HomeInfo extends Component {
  render() {

    const { name, age } = this.context
    return (
      <div>HomeInfo
        <p>{name},{age}</p>
      </div>
    )
  }
}

// 设置组件ContextType 类型
HomeInfo.contextType = ThemeContext

export default HomeInfo
...

函数式组件用法
...
import ThemeContext from './context/theme-context'

function HomeBanner() {
    {
        <div>
            <h2>homebanner</h2>
            <ThemeContext.Consumer>
                {
                    value => {
                        return <h2>{value.name}</h2>
                    }
                }
            </ThemeContext.Consumer>
        </div>
    }
}

export default HomeBanner
...

setState使用

为什么需要?

因为我们需动态监听数据的改变,以便更新到界面上,因为react没有数据劫持,所以我们需要这么一个东西来监听最新state重新渲染节目,我们必须通过setState来告知react数据已经发生改变。

setState方法是从Component继承过来的,使用组件中可以直接使用

使用

import React, { Component } from 'react'

export class App extends Component {
    constructor() {
        super()

        this.state = {
            message: "hello state",
            count: 0
        }
    }
    changeMessage() {
        // 1.基本使用
        // this.setState({
        //     message: "hello setSate"
        // })
        // 2.传入一个回调函数
        // 可以编写一些对state的处理逻辑
        // 当前的回调函数,会将之前的state和props传递进来
        // this.setState((state, props) => {
        //     // 编写一些对新state的处理逻辑
        //     // 可以获取之前的state和props
        //     console.log(state, props)
        //     return {
        //         message: "你好啊,李银河"
        //     }
        // })
        // 3. steState在ract的事件处理中是一个异步调用
        // 如果希望数据更新之后获取对应的结果执行逻辑代码,那么可以在setState中传入另外的参数 callback
        this.setState({
            message: "你好啊,李银河"
        }, () => {
            // 会在数据合并之后,自动执行
            console.log("---------", this.state.message)
        })


    }
    addCount() {

        this.setState({
            count: this.state.count + 1
        })

    }
    render() {
        const { message, count } = this.state
        return (
            <div>
                <h2>App component</h2>
                <p>message:{message}</p>
                <button onClick={e => this.changeMessage()}>change Message</button>
                <p>{count}</p>
                <button onClick={e => this.addCount()}>+1</button>
            </div>
        )
    }
}

export default App

相关内容推荐

巩义网站推广优化哪个好吉安网站优化公司汝州网站自然优化seo优化深圳网站建设保定正规的网站优化seo优化网站内链是什么意思网站sem优化推广栖霞商城网站优化公司网站开始如何优化网站自然优化哪里不错seo搜索优化网站新余网站运营优化平台张掖外贸网站优化推广常州网站优化靠谱镇江出名的网站推广优化企业网站优化竞云速捷详细洛阳平台seo网站优化工具物流网站优化方法银川网站优化排名软件头部网站标签优化专业网站定制开发优化公司如何优化网站建设如何优化自己网站裳郝丷云速捷南山网站关键词优化外包优化网站软件立择火3星优化网站北京优化公司网站你就要易速达寻甸网站优化服务眉山网站seo优化公司高新企业网站优化铁岭网站推广优化公司太原网站优化价格上海网站优化排名网站济宁口碑好的网站优化平台北辰区网站优化哪家效果好网站整站优化多少钱网站seo的主要优化内容教育网站seo优化方法大冶网站关键词优化新乡网站seo优化哪里的好淘宝关键词优化排名网站太原网站搜索优化网站如何自己做优化兰州搜索引擎优化网站排名站创客网站优化方法潮州如何选择免费网站优化网站关键词全网优化优化网站的发展深圳免费的网站推广优化塘厦网站seo推广优化好的销售行业网站优化哪家便宜学院网站的优化与建议网站优化排名软件首选火28星优化网站不能做什么律师网站优化建设推广红安seo网站优化排名哪家好甘肃优化网站报价电白区网站seo优化排名济宁网站优化平台阿城网站关键词优化费用如何做优化网站排名网站优化专员的提成怎么算铝型材网站seo优化哪家专业优化不太好的网站承德网站搜索优化软件丹东优化网站关键词郑州优化网站界面北京企业网站优化价格大型网站性能优化实战运营增城市网站关键词优化罗湖免费网站优化费用多少程序代码优化网站武威网站优化推广外包公司古交关键词网站优化对网站优化的分析陆良百度网站优化报价东莞专业的百度seo网站优化个人网站优化广东技术分析雀巢公司网站优化网站优化收费低毕节网站优化seo培训开原seo网站优化什么价格邯郸百度网站优化定西网站优化推广哪家好网站做优化享誉火17星天使沁阳外贸网站优化找哪家浏览器优化网站邛崃网站搜索优化服务莆田市网站seo优化联系方式福州百度网站快速优化兰州网站排名优化哪家不错网站的优化主要内容单页网站优化流程稷山县网站seo优化排名优化网站热线电话网站快速优化排名工具乐昌网站优化价格网站关键词优化的好处网站排名优化 来周o斯可以清溪网站关键词优化价格华蓥网站优化推广网站推广优化外包服务怎么样天津网站优化公司推荐哪家网站优化电池小组怎样优化网站点评网站搜索优化才能云速捷省力龙岗网站seo优化哪家好实惠的网站关键词优化代理渠道永清企业网站seo优化天桥区网站seo优化排名赣州浙江网站建站优化推广网站架构优化方案无锡做网站优化多少钱增城网站优化盐城阜宁网站优化全网营销推广网站优化哪家靠谱亳州文化传播推广网站优化建设锦江网站优化专业公司网站布局优化怎么做商丘网站seo优化费用多少沧州网站优化平台上饶网站运营优化平台天津网站建设推广优化台式优化硬件性能的网站开原seo网站优化什么价格网站链接优化包括红桥区网站优化哪家专业整站seo网站优化推荐上地网站优化网站长尾关键词优化服务公司seo网站优化步骤分享优企客网站seo优化包括哪些河北网站关键词排名优化荆州专业seo优化的网站巩义网站自然优化哪家价格便宜郑州网站seo优化找哪家五华区网站seo优化怎样保定市网站优化优化公司网站激越易 速达资阳网站优化营商许昌seo网站优化选哪家凯里哪家网站优化公司好网站一直优化不动是不是被惩罚镇江网站怎么优化小狗电器网站优化两个域名影响网站优化吗网站优化与网站竞价的区别网站优化推广资源石景山哪家网站优化好信息化网站搭建优化石景山网站推广优化方案王 清网站优化溧阳百度seo网站优化海口网站优化实战普陀区企业网站优化排名海南网站关键词排名优化是什么家电网站seo优化湖北网站关键词百度优化上饶网站建设优化公司贵州seo网站优化方法网站的优化仔细云速捷省力网站优化过于重视首页宜昌怎样优化网站玻璃优化切割软件网站香坊网站排名优化网站部结构优化湛江个人网站优化网站优化过程中不能忽视的细节百度发包优化网站福建企业网站优化静海网站推广优化多个独立网站怎么优化定州网站seo优化排名网站的优化高量易速达怎样优化网站用金苹果网站快照优化找金手指21网站搜索优化优选火3星惠州网站整站优化网站排名优化相信金苹果谢岗服装网站优化服务外包甘肃seo优化网站温江优化网站搜索微博优化网站推广河津关键词网站优化优化排名网站文云速捷沁阳百度网站优化联系方式网站优化高效推广的五大方法零部件网站seo优化费用许昌网站优化哪里不错网站是一边做一边优化优化网站软件魏云速捷真诚曹县个性化网站优化联系方式外贸网站优化网站优化公司网站优选火3星顶尖最火百度网站优化安康湖南网站优化推广中山教育网站优化查询网站同时做竞价和优化可以南通网站改版优化福田企业网站优化

合作伙伴

天下标王

龙岗网络公司
深圳网站优化
龙岗网站建设
坪山网站建设
百度标王推广
天下网标王
SEO优化按天计费
SEO按天计费系统