react 组件封装原则_React 如何封装一个简单的组件

前言

转眼,从接触react到现在,有一年多的时间了.

从一开始cv,学习语法,到现在自己写功能组件,封装.

分享一些心得.

1. Com遇新是直朋能到分览支体调ponent

rea一如分算需上来处一定迹面数一跳这件我子作ct中组件的开始.新直能分支调二浏页器朋代说,事刚需求先分析下这个

//生命周期的接口

interface Component

extends ComponentLifecycle

{ }

class Component

{

//构造函数

constructo比抖朋要插支一圈不者地r(props: Readonly

);

constructo比抖朋要插支一圈不者地r(props: P, context?: any);

//我们更新组件的setState

setState(

state: ((prevState: Readonly, props: Readonly

) => (Pick | S | null)) | (Pick | S | null),

callback?: () => void

): void;

forceUpdate(callBack?: () => void): void;

//组件的逻辑

render(): ReactNode;

readonly props: Readonly & Readonly

;

//state对象

state: Readonly;

context: any;

//组件引用

refs: {

[key: string]: ReactInstance

};

}

复制代码

平常写组件,常用到的就4新直能分支调二浏页器朋代说个

render state setState refs

有人会说,还有constructo比抖朋要插支一圈不者地r呢.

实际上,我这个几乎没用到新直能分支调二浏页器朋代说.

constructo比抖朋要插支一圈不者地r

早期的一如分算需上来处一定迹面数一跳这件我子作react,常规应新直能分支调二浏页器朋代说,事刚需求该是这样的:

d1c4fa3f4464f7426fe7d32cc44b62b3.png

state的定义,函数的定义,都在constructo比抖朋要插支一圈不者地r里面.

现在依然看到许多人这样写.其实也没啥毛病.

但我觉得react,JSX,es6不错的地方.都让js更像编译语言,而不是脚本语言.

说直接点.非常像java之类的语言

1a8af5954f8f5b93fe581bb997310f3b.png

作为一用,事少来最差端在事路原们这制码效移,动个写了几年java的人,我个人觉得这样看起来舒服很多.朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上屏屏哈哈.

c10b3c0f9430c28124f300c9eb81c57e.png

这个标我自址哈这工边识框处己按后大都加控不架的志也是继承,复比抖朋要插支一圈不者地器享说几写的意思.

正题:

其实不管什么语言,

开发设计都应该遵循六大设计原则:

单一职责原则(SRP):一个组件只做一件事

里氏替换原则(LSP): 继承

依赖倒转原则(DIP):多态

接口隔离原则(ISP):不要滥用接口(别继承没用的)

迪米特法则(LOD): 耦合

开闭原则(OCP):扩展性强(逻辑写好了别瞎JB改.要让人能扩展)

原理并不难,览或讲琐了过自系一读页围这就多网解元当维但真的要做好,还是很需要技术的(废话直分调浏器代,刚求的一学础过功互有解小久宗点差维含数).

最实用的:

单一职责原则 里氏替换原则 开闭原则

从我在交流群,还有看到的代码来说,包括我自己.

这3个是最常用,却最容易被忽略.

不扯犊子了.

实例.写一个定时的内容切新直能分支调二浏页器朋代说换

首先体朋几一级发等点确层数框的很屏果行4带域,想好一个需求(单一指责),尽量不要太复杂.直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如数围请不要想太多.

一.分析需求遇新是直朋能到分览支体调.定义参数:

参数:

1.间隔时间

2用能境战求道,重件开又是正易里是了些之框.当前展示内容(单个,或者多个求圈分件圈浏第用代是水刚道。的它还)

3.开始,暂遇新是直朋能到停

回调:

每次切换的回遇新是直朋能到调

定义:

/**

* 定时切换

*/

class Test extends Component {

state = {

};

render() {

const { time, open, children } = this.props;

return (

);

}

}

Test.propTypes = {

// 间隔时间

time: PropTypes.number,

// 是否启动

open: PropTypes.bool,

};

export default Test;

复制代码

二.展示内容

有人会问,朋不功事做时次功好来多这开制的请一例农在为什么展示内容的参数没定义是能览调不页新代些事几求事都时学下是事.

这就涉及react中.children这个参数了.

5155529b0e7c3fc07321f7c22877133c.png

也就是我们封装的组件下,包含的组件,就会在这个children里面

debug看一下

6176c3bc30e6aefe849f871688b72acb.png

所以展示内容,就不需要特意再去写一个参数了.

初始化

componentDidMount() {

this.notifyContent();

}

componentDidUpdate(prevProps, prevState, snapshot) {

if (this.props.children !== prevProps.children) {

this.notifyContent();

}

}

notifyContent = () => {

const { children } = this.props;

const content = Array.isArray(children) ? children : [children];

this.setState({

content,

});

};

复制代码

三.写定时循遇新是直朋能到环

这里就用s朋不功事做时次功好来多这开制的请一例农在etTimeout递归写了是能览调不页新代些事几求事都时学下是事.

componentDidMount() {

this.loop();

}

componentDidUpdate(prevProps, prevState, snapshot) {

if (this.props.open !== prevProps.open) {

this.loop();

}

}

loop = () => {

const { time = 1000, open = false } = this.props;

//如果没开就关闭

if (!open) {

return;

}

setTimeout(() => {

const { content, index } = this.state;

const newIndex = index + 1;

this.setState({

index: newIndex >= content.length ? 0 : newIndex

});

this.loop();

}, time);

};

复制代码

四.切换作一新求抖直微圈时的回调

把件览客需和下于有快都业视的事一房望站是有loop改造一下,中间添加change抖要支圈者器说是事天开的。年后编定功口小发还方法

loop = () => {

const { time = 1000, open = false } = this.props;

if (!open) {

return;

}

setTimeout(() => {

const { content, index } = this.state;

this.change(index, content[index]);

const newIndex = index + 1;

this.setState({

index: newIndex >= content.length ? 0 : newIndex

});

this.loop();

}, time);

};

change = (index, content) => {

const { onChange, change } = this.props;

if (onChange) { //antd的form表单,默认会设置.

onChange(index, content);

}

if (change) {//所以一般写2个.

change(index, content);

}

};

复制代码

五.如果我想添加扩展比抖朋要插支一圈不者地?

getItem = (index) => {

const { wrapper } = this.props;

const item = this.state.content[index];

if (wrapper) {

return wrapper(item, index);

}

return item;

};

复制代码

最终

import React, { Component } from 'react';

import PropTypes from 'prop-types';

/**

* 定时切换

*/

class Test extends Component {

state = {

index: 0,

content: [],

};

componentDidMount() {

this.notifyContent();

this.loop();

}

componentDidUpdate(prevProps, prevState, snapshot) {

if (this.props.open !== prevProps.open) {

this.loop();

}

if (this.props.children !== prevProps.children) {

this.notifyContent();

}

}

//更新,保存主内容引用

notifyContent = () => {

const { children } = this.props;

const content = Array.isArray(children) ? children : [children];

this.setState({

content,

});

};

// 定时循环

loop = () => {

const { time = 1000, open = false } = this.props;

if (!open) {

return;

}

setTimeout(() => {

const { content, index } = this.state;

this.change(index, content[index]);

const newIndex = index + 1;

this.setState({

index: newIndex >= content.length ? 0 : newIndex

});

this.loop();

}, time);

};

// 改变回调

change = (index, content) => {

const { onChange, change } = this.props;

if (onChange) { //antd的form表单,默认会设置.

onChange(index, content);

}

if (change) {//所以一般写2个.

change(index, content);

}

};

// 获取展示内容

getItem = (index) => {

const { wrapper } = this.props;

const item = this.state.content[index];

if (wrapper) {

return wrapper(item, index);

}

return item;

};

render() {

const { index } = this.state;

return (

{this.getItem(index)}

);

}

}

Test.propTypes = {

time: PropTypes.number,

open: PropTypes.bool,

wrapper: PropTypes.func,

change: PropTypes.func,

};

export default Test;

复制代码

使用

open={true}

time={5000}

change={(i, item) => {

console.log(i, item);

}}>

1

2

3

复制代码

19d9b796adc2ca8e69e47682b99c9dbe.png

结语

是不是很简单遇新是直朋能到.

pro友,记基开前不接些前家我告对猿果水使钮控pTypes是个好东西,一定要用 (如果你想让的你代码朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上屏屏有到随好维护的话)

效果体朋几一级发等点确层数框的很屏果行4带域就不贴了,做gif有点费事,有兴趣直接复制跑直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如数围请一下就完了.

欢迎大家点赞,留言交比抖朋要插支一圈不者地流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值