React(九)—— 操作表单

React的表单应用是有一些小坑的,练习的时候也是遇到了很多,希望这边能帮助到大家

在写表单之前写一个基础方法,bind函数

     function list(){
            console.log(arguments[0])
            return Array.prototype.slice.call(arguments)
        }
        var lists=list.bind(null,4) //bind 函数后续参数等于=预设参 并且在实参最前面,可传多个用逗号隔开
        console.log(lists(1,2,3)) //打印4 ,[4,1,2,3]
常常我们只理解了第一个参数,第二个参数可能有点陌生
开始React表单处理
    <script type="text/babel">
       class FormComponent extends React.Component{
           constructor(props){
               super(props)
           }

           render(){
               return(
                   <div>
                     <form>
                     
                     </form>
                   </div>
               )
           }
       }

       ReactDOM.render(<FormComponent/>,document.getElementById('div'))
    </script>
老规矩 初始化!!每次都手打一遍

首先编辑几个默认初始状态

  constructor(props){
               super(props)
               this.state={
                   username:'',
                   checked:true,
                   gender:'man'
               }
           }

待会将以上的默认状态绑定给input

           render(){
               return(
                   <div>
                     <form>
                           <label htmlFor="username">请输入您的姓名:</label>
                            <input name="username"  />
                          <br/>
                     </form>
                   </div>
               )
           }

简单写个单标签input,注意一点就是for,基于jsx的小驼峰写法,这里的for要写成htmlFor,接下来再写两个状态

   render(){
               return(
                   <div>
                     <form>
                          <label htmlFor="username">请输入您的姓名:</label>
                            <input name="username"  />
                          <br/>
                          <label htmlFor="checked">Yes or No</label>
                            <input name="checked" type="checkbox" />
                          <br/>
                          <label htmlFor="gender">帅哥 or  美铝</label>
                            <select name="gender">
                               <option value="man">Cool Man</option>
                               <option value="woman">Sure Woman</option>
                            </select>

                          <br/>
                     </form>
                   </div>
               )
           }

简单编写常用的几个常用的表单元素

给它加一下默认值

render(){
               return(
                   <div>
                     <form>
                          <label htmlFor="username">请输入您的姓名:</label>
                            <input name="username"  value={this.state.username} />
                          <br/>
                          <label htmlFor="checked">Yes or No</label>
                            <input name="checked" type="checkbox" checked={this.state.checked} />
                          <br/>
                          <label htmlFor="gender">帅哥 or  美铝</label>
                            <select name="gender" value={this.state.gender}>
                               <option value="man">Cool Man</option>
                               <option value="woman">Sure Woman</option>
                            </select>

                          <br/>
                     </form>
                   </div>
               )
           }

因为React是单向数据流,它不像vue是双向绑定的,相当于我此时已经把表单的值写死了,在React表单中统一使用onChange监听值的改变

    <script type="text/babel">
       class FormComponent extends React.Component{
           constructor(props){
               super(props)
               this.state={
                   username:'',
                   checked:true,
                   gender:'man'
               }
           }
           
           handleChangeUsername(event){
                this.setState({username:event.target.value})
           }
           handleChangeChecked(event){
                this.setState({checked:!this.state.checked}) 
           }
           handleChangeGender(event){
                this.setState({gender:event.target.value}) 
           }
           render(){
               return(
                   <div>
                     <form>
                          <label htmlFor="username">请输入您的姓名:</label>
                            <input name="username"  value={this.state.username} onChange={this.handleChangeUsername.bind(this)} />
                          <br/>
                          <label htmlFor="checked">Yes or No</label>
                            <input name="checked" type="checkbox" checked={this.state.checked} onChange={this.handleChangeChecked.bind(this)} />
                          <br/>
                          <label htmlFor="gender">帅哥 or  美铝</label>
                            <select value={this.state.gender} onChange={this.handleChangeGender.bind(this)}>
                               <option value="man">Cool Man</option>
                               <option value="woman">Sure Woman</option>
                            </select>

                          <br/>
                     </form>
                   </div>
               )
           }
       }

       ReactDOM.render(<FormComponent/>,document.getElementById('div'))
    </script>

此时的逻辑就是在React更改值的时候先修改默认的state,再渲染到对应的数据,当然这么写是不好的,代码量重复太多,此时就可以使用bind复用的方法

           render(){
               return(
                   <div>
                     <form>
                          <label htmlFor="username">请输入您的姓名:</label>
                            <input name="username"  value={this.state.username} onChange={this.handleChange.bind(this,'username')} />
                          <br/>
                          <label htmlFor="checked">Yes or No</label>
                            <input name="checked" type="checkbox" checked={this.state.checked} onChange={this.handleChange.bind(this,'checked')} />
                          <br/>
                          <label htmlFor="gender">帅哥 or  美铝</label>
                            <select value={this.state.gender} onChange={this.handleChange.bind(this,'gender')}>
                               <option value="man">Cool Man</option>
                               <option value="woman">Sure Woman</option>
                            </select>

                          <br/>
                     </form>
                   </div>
               )
           }

首先针对开篇提到的bind方法,将标签的name作为函数参数传递,并且方法名都是相同的,那bind传递的参数即是函数的第一个参数

           handleChange(name,event){
               var newState={}
               naeState[name]
           }

在方法中新建一个对象,利用关联数组的写法针对起初状态的key值建立对应的value

           handleChange(name,event){
               var newState={}
               newState[name]=name=="checked"?event.target.checked:event.target.value
               this.setState(newState)
           }

首先参数name就是对应事件的对象,中间那句代码乍一看有点迷,其实是很简单的三元运算符,如果当前改变的对象不是checkbox就传入改变的value,不理解多看几遍,类似函数重载的思想,放一下代码,真实代码以下方代码为准,可能有误差,加了一个提交的小事件

    <script type="text/babel">
       class FormComponent extends React.Component{
           constructor(props){
               super(props)
               this.state={
                   username:'',
                   checked:true,
                   gender:'man'
               }
           }
           
           handleChange(name,event){
               var newState={}
               newState[name]=name=="checked"?event.target.checked:event.target.value
               this.setState(newState)
           }

           handleSubmit(event){
               event.preventDefault();
               var is=this.state.checked?'是':'不是'
               var gender=this.state.gender=='man'?'帅哥':'美女'
               alert(this.state.username+is+gender)
           }
           
           render(){
               return(
                   <div>
                     <form>
                          <label htmlFor="username">请输入您的姓名:</label>
                            <input name="username"  value={this.state.username} onChange={this.handleChange.bind(this,'username')} />
                          <br/>
                          <label htmlFor="checked">Yes or No</label>
                            <input name="checked" type="checkbox" checked={this.state.checked} onChange={this.handleChange.bind(this,'checked')} />
                          <br/>
                          <label htmlFor="gender">帅哥 or  美铝</label>
                            <select  name="gender" value={this.state.gender} onChange={this.handleChange.bind(this,'gender')}>
                               <option value="man">Cool Man</option>
                               <option value="woman">Sure Woman</option>
                            </select>

                          <br/>
                          <button type="submit" onClick={this.handleSubmit.bind(this)}>提交</button>
                     </form>
                   </div>
               )
           }
       }

       ReactDOM.render(<FormComponent/>,document.getElementById('div'))
    </script>
可能有些小伙伴觉得还是有点烦,写这些name,name也是可以获取的

首先取消参数的传递,然后在方法中获取name

           handleChange(event){
               var newState={}
               newState[event.target.name]=event.target.name=="checked"?event.target.checked:event.target.value
               this.setState(newState)
           }

需要注意的点就是,React是单向流,如果我们在表单中不设置onChange事件是没法重新渲染的

...这边补充一个真实DOM写法,当然是不建议使用的
    <script type="text/babel">
       class FormComponent extends React.Component{
           constructor(props){
              super(props)
            
           }

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

推荐阅读更多精彩内容

  • 本笔记基于React官方文档,当前React版本号为15.4.0。 1. 安装 1.1 尝试 开始之前可以先去co...
    Awey阅读 7,700评论 14 128
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,833评论 1 18
  • 下班后,匆匆忙忙赶回家,就马不停蹄的开始洗菜,切菜,好几天没有认真做一顿饭了,早上洗的衣服还没晾出来,要准备一个儿...
    如然_天之明阅读 206评论 0 0
  • 我们要做自己的主人,活出生命的意义。 学习 设计课程在本周学习了短外套、风衣、牛仔裤的款式工艺图,在下周就要开始C...
    杨霞_fd9b阅读 110评论 0 1
  • “金...箍...棒...”,和尚口角开合间,轻轻说了句。 怵的,金箍棒停滞半空。猴子呆木,又加大了手上的力度,但...
    达哥唠嗑小屋阅读 1,209评论 6 10