react受控于非受控组件

一、受控组件

受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据

举个简单的例子:

classTestComponentextendsReact.Component{constructor(props){super(props);this.state={username:'lindaidai'};}render(){return}}

这时候当我们在输入框输入内容的时候,会发现输入的内容并无法显示出来,也就是input标签是一个可读的状态

这是因为value被this.state.username所控制住。当用户输入新的内容时,this.state.username并不会自动更新,这样的话input内的内容也就不会变了

如果想要解除被控制,可以为input标签设置onChange事件,输入的时候触发事件函数,在函数内部实现state的更新,从而导致input框的内容页发现改变

因此,受控组件我们一般需要初始状态和一个状态更新事件函数

二、非受控组件

非受控组件,简单来讲,就是不受我们控制的组件

一般情况是在初始化的时候接受外部数据,然后自己在内部存储其自身状态

当需要时,可以使用ref 查询 DOM 并查找其当前值,如下:

importReact,{Component}from'react';exportclassUnControllextendsComponent{constructor(props){super(props);this.inputRef=React.createRef();}handleSubmit=(e)=>{console.log('我们可以获得input内的值为',this.inputRef.current.value);e.preventDefault();}render(){return(this.handleSubmit(e)}>)}}

关于refs的详情使用可以参考之前文章

三、应用场景

大部分时候推荐使用受控组件来实现表单,因为在受控组件中,表单数据由React组件负责处理

如果选择非受控组件的话,控制能力较弱,表单数据就由DOM本身处理,但更加方便快捷,代码量少

针对两者的区别,其应用场景如下图所示:

参考文献

  *

  * *

  * * *

  * * * *

  上述的三角形方针表示只能向下走或向右走,(向下走表示入栈,向右走表示出栈),那上述的三角形方针就表示123可能的出栈顺序。下面的图就表示出栈顺序为231。

  如果用1表示入栈,0表示出栈,则1-n的入栈与出栈顺序就可由2n个01字符串表示。那所有情况就是C(n,2n),当然里面包含许多不满足堆栈实际情况的出入栈顺序。

  由上述三角形方针可知,如果出栈个数多于入栈个数的话是不可能存在的情况,我们上述举的例子出栈顺序为231的话,整体用01表示为110100(1入栈,2入栈,2出栈,3入栈,3出栈,1出栈),那假设01串为100110的话肯定是不可能的,入栈才1个数,出栈就两个数了,通过这个例子可以明白为何出栈个数多于入栈个数的话是不可能存在的,即0的个数大于1的个数。下面来分析这种不满足情况的有多少种:

  已知整个01数字串中包含n个0,n个1。在第一次出现0的个数比1的个数多时,假设1出现了k次,0出现了k+1次,则之后的01序列中1的个数为n-k,0的个数为n-k-1,若将后半部分的0换成1,1替换成0,则总体的数字串包含1有k+n-k-1=n-1个,同理0的个数有n+1个。那就可以求出来不满足情况的有C(n+1,2n)个。

  因此,若将1-n顺序放入堆栈中,共有情况C(n,2n)-C(n+1,2n)种。

利用组合数学

  假设数字1在出栈顺序中占第k位(从第一位开始),则数字1之前包含k-1个数字,1之后包含n-k个数字,且数字1之前出现的数字一定为2-k,数字1之后出现的数字为k+1到n。如图所示:

  数字1入栈后,数字2-k以某种顺序入栈并出栈,之后数字1出栈,(满足假设在第k位出栈),之后数字k+1到n以某种顺序入栈并出栈。数字2-k以某种顺序入栈并出栈的情况种数为f(k-1),数字k+1到n以某种顺序入栈并出栈的情况种数为f(n-k),因此由乘法原理可知,数字1在第k位出栈的情况种数为f(k-1)·f(n-k)。

  数字1又可能出现在第1位,第2位,第3位,…,第k位,…,第n位。

出现在第1位的情况总数为f(0)·f(n-1);

出现在第2位的情况总数为f(1)·f(n-2);

出现在第3位的情况总数为f(2)·f(n-3);

出现在第k位的情况总数为f(k-1)·f(n-k);

出现在第n位的情况总数为f(n-1)·f(0);

因此总的可能个数为f(0)·f(n-1)+f(1)·f(n-2)+f(2)·f(n-3)+…+f(k-1)·f(n-k)+f(n-1)·f(0)。这个就是卡兰特数了,最后结果f(n) = C(n,2n)-C(n+1,2n)

你可能感兴趣的:(react受控于非受控组件)