React表单

表单组件两种类型:约束组件和无约束组件


1.无约束组件:

eg:

varMyForm= React.createClass({

render: function() {

return <input type="text" defaultValue="Hello World!"/>;

}

});

组件的value并非由父组件设置,而是让<input/>自己控制自己的值。

一个无约束的组件没有太大用处,除非可以访问它的值。可以通过给<input/>添加一个ref属性以访问到DOM节点的值。ref是一个不属于DOM属性的特殊属性。可以通过this上下文访问这个节点,所有的ref都添加到了this.refs上。

eg:调用value:

MyFormReact.createClass({

submitHandler: function(event) {

event.preventDefault();

//通过ref访问输入框

var helloTo = this.refs.helloTo.getDOMNode().value;

alert(helloTo);

}

render: function() {

return (

form onSubmit={this.submitHandler}>

ref="helloTo" />

br button ="submit">Speak</buttonform>

);

}

});


2.约束组件:

约束组件的模式与React其他类型组件的模式一致。表单的状态交由React组件控制。状态值被存储在React组件的state中。

约束组件能更好的控制表单组件。在约束组件中,输入框的值是由父组件社设置的。

eg:

React.createClass({

getInitialState: function() {

return {

helloTo: "Hello World!"

};

}

handleChange: function(event){

this.setState({

helloTo: event.target.value

});

}

submitHandler: function(event) {

event.preventDefault();

ref访问输入框

alert(this.state.helloTo);

}

render: function() {

valuehelloTo} onChangethis.handleChange}>

);

}

});

约束组件可以控制数据流,在用户输入数据时更新state。如将用户输入的字符转成变大写(如:this.setState({helloTo: event.target.value.toUpperCase()});)并添加到输入框时不会发生闪烁。这是因为React拦截了浏览器原生的change事件,在setState被调用后,这个组件就会重新渲染输入框。然后React计算差异,更新输入框的值。


3.表单事件:

React支持所有HTML事件。这些事件遵循驼峰命名的约定,且会被转成合成事件。这些事件是标准化的,提供了跨浏览器的一致接口。

所有合成事件都提供了event.target来访问触发事件的DOM节点。

访问约束组件最简单的方式之一:

handleEvent: function(syntheticEvent) {

DOMNode = syntheticEvent.target;

newValue = DOMNode.value;

}


4.Label:

Label是表单元素中重要组件,可以明确地向用户传达你的要求,提升单选框和复选框的可用性。

React中class变成className,for变为htmlFor:

<label className="col-sm-3 control-label no-padding-right">开户行<span className="red">*</span></label>


5.文本框和Select:

React中的<textarea/>和<select/>:(约束的)

<textarea value={this.state.value} onChange={this.handleChange} />

select state.value} this.handleChange}option ="grapefruit">Grapefruitoption="lime">Lime="coconut">Coconut="mango">Mangoselect>

多选时可在select后加上multi={true}属性

当使用多选的select时,select组件的值不会更新,只有选项的selected属性会发生变化。可以使用ref或event.target来访问选项,检查它们是否被选中。

eg:

handleChange: function(event) {

checked = [];

sel = event.target;

for(i = 0; i < sel.length; i++) {

value = sel.value[i];

if (value.selected) {

checked.push(value.value);

}

}

}


6.复选框和单选框:

类型为checkbox或radio的<input/>与类型为text的<input/>的行为完全不一样。通常复选框和单选框的值是不变的,只有checked状态会变化。所以要控制复选框或单选框就要控制它们的checked属性。也可以在非约束的复选框或者单选框中使用defaultChecked。

="checkbox" className="ace"

checkedoutboundLogisticsStatus == "SENTED"}

handleLogisticsStatusChange}span ="lbl">推送出库单

span

7.表单元素的name属性:

在React中,name属性对于表单元素来说并没有那么重要,因为约束表单组件已经把值存储到了state中,并且表单的提交事件也会被拦截。在获取表单值的时候,name属性并不是必须的。对于非约束的表单组件来说,也可以使用refs来直接访问表单元素。

那么属性的作用:

-- name属性可以让第三方表单序列化类库在React中正常工作;

-- 对于仍然使用传统提交方式的表单来说,name属性是必须的;

-- 在用户浏览器中,name被用在自动填写常用信息中,比如用户地址;

-- 对于非约束的单选框组件,name是有必要的,它可以作为这些组件分组的依据,确保在同一时刻,同一个表单中拥有相同name的单选框只有一个可以被选中。如果不使用name属性,这一行为可以使用约束的单选框实现。


8.多个表单元素与change处理器:

重用事件处理器:

-- 通过.bind传递其他参数

var MyForm = React.createClass({

getInitialState: function () {

given_name: "",

family_name: ""

};

},

handleChange: function (name,event) {

newState = {};

newState[name] = event.target.value;

this.setState(newState);

},67);">submitHandler: function (event) {

event.preventDefault();

words = [

"Hi",

given_name,122);font-weight:bold;">family_name

];

alert(words.join(" "));

},67);">render: submitHandler}label htmlFor="given_name">Given Name:labelinput

="text"

name="given_name"

given_name}

handleChange.bind(this,'given_name')}="family_name">Family Name:="family_name"

family_name}

'family_name')}>;

}

});

-- 使用DOMNode的name属性来判断需要更新哪个组件的状态

function (event) {

newState[event.target.name] = event.target.value;

>;

}

});

-- React.addons.LinkedStateMixmin为组件提供一个linkState方法。linkState返回一个对象,包含value和requestChange两个属性。

value根据提供的name属性从state中获取对应的值

requestChange是一个函数,使用新的值更新同名的state

eg:

this.linkState('given_name');

//返回

{

value:this.state.given_name

requestChange: function (newValue) {

this.setState({

given_name: newValue

});

},

}

需要把这个对象传递给一个React特有的非DOM属性valueLink。valueLink使用对象提供的value更新表单域的值,并提供一个onChange处理器,当表单域更新时使用新的值调用requestChange。

MyForm = React.createClass({

mixins: [React.addons.LinkedStateMixin],122);font-weight:bold;"> valueLinkthis.linkState('given_name')} 'family_name')} >;

}

});

这种方法便于控制表单域,把其值保存在父组件中的state中。而且,其数据流仍然与其他约束的表单元素保持一致。

但是使用这种方式往数据流中添加定制功能时,复杂度会增加。建议只在特定的场景下使用。因为传统约束表单组件提供了同样的功能且更加灵活。


9.自定义表单组件:

可以在项目中复用共有功能。也是一种将交互界面提升为一种更加复杂的表单组件(如单选框、多选框)的好方法。

eg:自定义表单单选框和valueLink结合使用:

div ="col-sm-10"PaymentDistrictSelect linkState('paymentDistrictCode')}div

10.Focus:

控制表单组件的focus可以很好地引导用户按照表单逻辑逐步填写。可减少用户操作,增强可用性。

11.可用性:

React组件常常缺乏可用性。如缺乏对键盘操作的支持。


12.传达要求:

placeholder可以用来显示输入实例或作为没有输入时的默认值

<inputtype="text"name="keyword"placeholder="对账单号/预付单号"valueLink={this.linkState("keyword")}style={{width:'100%'}}/>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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