react受控于非受控组件

一、受控组件

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

举个简单的例子:

classTestComponentextendsReact.Component{constructor(props){super(props);this.state={username:'lindaidai'};}render(){return<inputname="username"value={this.state.username}/>}}

这时候当我们在输入框输入内容的时候,会发现输入的内容并无法显示出来,也就是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(<formonSubmit={e=>this.handleSubmit(e)}><inputdefaultValue="lindaidai"ref={this.inputRef}/><inputtype="submit"value="提交"/></form>)}}

关于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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容