React,用组件化思想写前端代码

前阵子尝试用React开发了一个项目的前端,写起来还算是流畅。将页面中各模块进行分割并形成组件之后,管理起来更加的方便,代码的可读性也相对于传统的面条式编程有很大的提高。React相对于Angular来说,我个人认为是更加轻量化的,它更注重于MVC中的V。

举个例子,开发中常常会用到button这个元素,我们会给button加上样式、行为等等。一个项目中button可能是被经常重复使用的,他的样式也可能几乎是一摸一样的,无非是color和size的区别而已。按照传统的写法,可能代码是下面这个样子的:

<button onClick='function(){alert('clicked!')}' class='btn btn-green btn-large'>点我</button>

如果click事件是有默认事件的,class默认也是绿色,那么每次都写这一堆是有点烦了,如果我们将这个button视为一个组件,那么我们可以给它设置默认的样式和行为,并通过传不同的值给组件改变它的状态。我们来个React版本的。

var Button = React.createClass({
    propTypes:{
        children: React.PropTypes.any,className: React.PropTypes.string,disabled: React.PropTypes.bool,onClick: React.PropTypes.func,style: React.PropTypes.object,type: React.PropTypes.oneOf(['submit','button'])
    },getInitialState:function(){
        return {
            disabled:this.props.disabled,className:'btn-green',type: this.props.type ? this.props.type : 'button',text: null
        }
    },componentWillReceiveProps:function(newProps){
        if (newProps.disabled !== this.props.disabled) {
            this.setState({ disabled: newProps.disabled })
        }
    },text:function(text){
        this.setState({
            text:text
        });
    },handleClick:function() {
        if (this.props.onClick) {
            this.props.onClick()
        }
    },render:function(){
        return (
            <button className={this.state.className} disabled={this.state.disabled} type={this.state.type} style={this.props.style} onClick={this.handleClick.bind(this)}> {this.state.text || this.props.children} </button> ); } });

这里Button就视为一个模块或者组件,它接收父组件的值来改变它的默认状态,当没有值传入时,使用默认的内部值。
为了达到最开始那个button的效果,我们可以这么使用它:

React.render(
       <div>
           <Button size='large' onClick='function(){alert('click')}'>
       </div>,document.getElementById('container'));

虽然这样看上去好像并没有和传统方式有太大的区别,而且还多了一堆代码去定义这个button组件,得不偿失,但是这仅仅只是组件化的开始,面对更复杂的组件时,它的好处就体现出来了。看看下面的例子:

需求是我们需要一个搜索框,在用户输入的同时通过异步请求进行搜索,同时为了防止用户输入速度快导致请求过于频繁,在用户输入每个字后延迟300ms进行搜索,如果在这段时间内用户任然有输入,那么就再延迟300ms,也就是高频防抖。

以传统的方式来,我们得先写个input,然后把这个input包装成search input的样子,然后注册事件,并在事件中设置延迟函数,然后才真正执行搜索动作。。。等另一个页面又有搜索时,重复刚才的步骤。如果把SearchInput设想成一个组件,那么它会是下面这个样子的。

var SearchInput = React.createClass({
    inputTimeout:null,propTypes:{
        size: React.PropTypes.string,onInput: React.PropTypes.func,delay: React.PropTypes.number,disabled: React.PropTypes.bool
    },getInitialState:function(){
        return {
            size: this.props.size ? this.props.size : '',delay: this.props.delay ? this.props.delay : 300
        }
    },handleInput: function(event){
        var value = event.target.value;
        if(this.inputTimeout){
            window.clearTimeout(this.inputTimeout);
        }
        var that = this;
        this.inputTimeout = setTimeout(function(){
            that.props.onInput(value);
        },this.state.delay);
    },render: function(){
        var sizeClasss = this.state.size ? "topcoat-search-input--"+this.state.size :
            "topcoat-search-input";
        return (
            <input type="search" placeholder='search' onInput={this.handleInput.bind(this)} className={sizeClasss} disabled={this.props.disabled} /> ); } });

我们将延迟的时间和是否禁用等信息当做属性传给SearchInput组件,并将延迟操作的逻辑等封装在组件内部,以后我们就不用关心这些了,直接使用即可。

React.render(
       <div>
           <SearchInput delay=500 onClick='function(value){alert(value)}'></SearchInput>
       </div>,document.getElementById('container'));

我们传入delay与搜索逻辑函数即可,input的value也会传入搜索逻辑函数。

当然,还有更复杂的情况,我们可以将逻辑封装在组件中,使用的人只需要通过属性改变组件的状态,而不需要关心组件状态改变的逻辑。

最近尝试封装一些通用的React UI组件,挑选了Topcoat样式去封装,感兴趣的朋友可以点击下面这个链接
https://github.com/ForeverPx/react-topcoat

文章作者:forevercjl
原文链接:www.foreverpx.cn 转载请注明出处。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom