taro-ui
                                
                                
                                
                                    taro-ui copied to clipboard
                            
                            
                            
                        taro-ui 3.0.0-alpha.3 表单组件 AtForm 提交按钮点击后报错
Taro UI 版本信息
v2.3.4
问题描述
表单组件 AtForm 提交按钮点击后报错。 使用 taro inti 命令安装时,选择 taro-ui,默认安装的 taro-ui 版本(3.0.0-alpha.3)
复现步骤
- taro create --name test
 - 根据官网示例,完成代码文件 test.tsx,具体代码见下方
 - yarn dev:weapp
 - 微信开发者工具打开,点击表单提交按钮
 
复现代码
// test.tsx
import React, { Component } from 'react'
import { View, Text } from '@tarojs/components'
import { AtForm, AtInput, AtButton } from 'taro-ui'
import "taro-ui/dist/style/components/button.scss" // 按需引入
import './test.scss'
export default class Test extends Component {
  constructor () {
    super(...arguments)
    this.state = {
      value: ''
    }
  }
  handleChange (value) {
    this.setState({
      value
    })
  }
  onSubmit (event) {
    console.log(this.state.value)
  }
  onReset (event) {
    this.setState({
      value: '',
    })
  }
  render () {
    return (
      <View className='test'>
        <AtForm
          onSubmit={this.onSubmit.bind(this)}
          onReset={this.onReset.bind(this)}
        >
          <AtInput
            name='value'
            title='文本'
            type='text'
            placeholder='单行文本'
            value={this.state.value}
            onChange={this.handleChange.bind(this, 'value')}
          />
          <AtButton formType='submit'>提交</AtButton>
          <AtButton formType='reset'>重置</AtButton>
        </AtForm>
      </View>
    )
  }
}
报错信息
MiniProgramError
Cannot read property 'triggerEvent' of undefined
TypeError: Cannot read property 'triggerEvent' of undefined
    at AtButton.onSumit (http://127.0.0.1:26619/appservice/vendors.js:3051:21)
    at TaroElement.dispatchEvent (http://127.0.0.1:26619/appservice/taro.js:4542:29)
    at Ze.eventHandler [as eh] (http://127.0.0.1:26619/appservice/taro.js:2917:10)
    at Object.r.safeCallback (http://127.0.0.1:26619/appservice/__dev__/WAService.js?t=wechat&v=2.12.2&s=1599558505684:2:1954289)
    at http://127.0.0.1:26619/appservice/__dev__/WAService.js?t=wechat&v=2.12.2&s=1599558505684:2:2123485
    at s (http://127.0.0.1:26619/appservice/__dev__/WAService.js?t=wechat&v=2.12.2&s=1599558505684:2:2050351)
    at http://127.0.0.1:26619/appservice/__dev__/WAService.js?t=wechat&v=2.12.2&s=1599558505684:2:2123410
    at r (http://127.0.0.1:26619/appservice/__dev__/WAService.js?t=wechat&v=2.12.2&s=1599558505684:2:2031780)
    at http://127.0.0.1:26619/appservice/__dev__/WAService.js?t=wechat&v=2.12.2&s=1599558505684:2:2031902
    at http://127.0.0.1:26619/appservice/__dev__/WAService.js?t=wechat&v=2.12.2&s=1599558505684:2:959048
console.error @ VM193:1
errorReport @ VM197 WAService.js:2
thirdErrorReport @ VM197 WAService.js:2
(anonymous) @ VM197 WAService.js:2
(anonymous) @ VM197 WAService.js:2
r.safeCallback @ VM197 WAService.js:2
r.call @ VM197 WAService.js:2
message @ VM197 WAService.js:2
r.safeCallback @ VM197 WAService.js:2
(anonymous) @ VM197 WAService.js:2
s @ VM197 WAService.js:2
(anonymous) @ VM197 WAService.js:2
r @ VM197 WAService.js:2
(anonymous) @ VM197 WAService.js:2
(anonymous) @ VM197 WAService.js:2
i @ VM16 asdebug.js:1
c @ VM16 asdebug.js:1
(anonymous) @ VM16 asdebug.js:1
p @ VM16 asdebug.js:1
g @ VM16 asdebug.js:1
(anonymous) @ VM16 asdebug.js:1
_ws.onmessage @ VM16 asdebug.js:1
系统信息
👽 Taro v3.0.9
  Taro CLI 3.0.9 environment info:
    System:
      OS: macOS 10.15.5
      Shell: 5.7.1 - /bin/zsh
    Binaries:
      Node: 12.13.1 - /usr/local/bin/node
      Yarn: 1.15.2 - /usr/local/bin/yarn
      npm: 6.9.0 - /usr/local/bin/npm
    npmPackages:
      @tarojs/cli: 3.0.9 => 3.0.9 
      @tarojs/components: 3.0.9 => 3.0.9 
      @tarojs/mini-runner: 3.0.9 => 3.0.9 
      @tarojs/react: 3.0.9 => 3.0.9 
      @tarojs/runtime: 3.0.9 => 3.0.9 
      @tarojs/taro: 3.0.9 => 3.0.9 
      @tarojs/webpack-runner: 3.0.9 => 3.0.9 
      babel-preset-taro: 3.0.9 => 3.0.9 
      eslint-config-taro: 3.0.9 => 3.0.9 
      react: ^16.10.0 => 16.13.1 
      taro-ui: ^3.0.0-alpha.3 => 3.0.0-alpha.3 
补充信息
                                    
                                    
                                    
                                
欢迎提交 Issue~
如果你提交的是 bug 报告,请务必遵循 Issue 模板的规范,尽量用简洁的语言描述你的问题,最好能提供一个稳定简单的复现。🙏🙏🙏
如果你的信息提供过于模糊或不足,或者已经其他 issue 已经存在相关内容,你的 issue 有可能会被关闭。
Good luck and happy coding~
https://github.com/NervJS/taro-ui/issues/1169 https://github.com/NervJS/taro-ui/issues/1147 都是这个问题
把
<AtButton formType='submit'>提交</AtButton>
改成
<AtButton type={"primary"}>提交</AtButton>
可以消除报错。
对我是生效的,你可以试试。
把
<AtButton formType='submit'>提交</AtButton>改成<AtButton type={"primary"}>提交</AtButton>可以消除报错。 对我是生效的,你可以试试。
你这样貌似没有触发 onsubmit 事件呀
把
<AtButton formType='submit'>提交</AtButton>改成<AtButton type={"primary"}>提交</AtButton>可以消除报错。 对我是生效的,你可以试试。你这样貌似没有触发 onsubmit 事件呀
你手动指明onClick就可以触发了呀
        <AtButton
          type={"primary"}
          onClick={this.onSubmit}
        >提交</AtButton>
                                    
                                    
                                    
                                
把
<AtButton formType='submit'>提交</AtButton>改成<AtButton type={"primary"}>提交</AtButton>可以消除报错。 对我是生效的,你可以试试。你这样貌似没有触发 onsubmit 事件呀
你手动指明onClick就可以触发了呀
<AtButton type={"primary"} onClick={this.onSubmit} >提交</AtButton>
你说的很对,回头我试一下。
把
<AtButton formType='submit'>提交</AtButton>改成<AtButton type={"primary"}>提交</AtButton>可以消除报错。 对我是生效的,你可以试试。你这样貌似没有触发 onsubmit 事件呀
你手动指明onClick就可以触发了呀
<AtButton type={"primary"} onClick={this.onSubmit} >提交</AtButton>
这样的话好像并不是走的onSubmit,只是做了个点击事件,也拿不到表单内容了吧
把
<AtButton formType='submit'>提交</AtButton>改成<AtButton type={"primary"}>提交</AtButton>可以消除报错。 对我是生效的,你可以试试。你这样貌似没有触发 onsubmit 事件呀
你手动指明onClick就可以触发了呀
<AtButton type={"primary"} onClick={this.onSubmit} >提交</AtButton>这样的话好像并不是走的onSubmit,只是做了个点击事件,也拿不到表单内容了吧
是的,但是呢,因为我当前页面的变量都存在state里,所以只需要有事件告诉我交数据即可,变量我从state里获取。
我个人感觉这个组件就基本没实质性的用法,因为他官方都说了“开发者要获取数据,可以自行在页面的 state 中获取”。所以我认为taro-ui的form表单还没作到位吧
同样的问题……那么只能一个个手动获取 form 中的值吗?那也太麻烦了吧
有解决办法?
@twoheartliu @yuanjinxiugithub 面向对象的思路:你把form当成一个对象,即state里的obj,在render里绑定value时,都使用obj.value,这样,当你接收submit时,form的值都在obj,就免去了手动获取了。
我个人感觉这个组件就基本没实质性的用法,因为他官方都说了“开发者要获取数据,可以自行在页面的 state 中获取”。所以我认为taro-ui的form表单还没作到位吧
作者的原话是:
携带 form 中的数据触发 submit 事件,由于小程序组件化的限制,onSubmit 事件获得的 event 中的 event.detail.value 始终为空对象,开发者要获取数据,可以自行在页面的 state 中获取
我想,可能他们考虑到把form可以包罗的成员情况都覆盖,会使得组件没有那么干净;覆盖一部分,也使用者改造更费劲,不如直接给白坯房,这样造起轮子简便。
应该添加几个表单校验的方法,还不够完善,不是那么好用
mark
应该添加几个表单校验的方法,还不够完善,不是那么好用
可以借助rc-field-form实现表单校验相关功能,但是UI库连基本的调用微信Button的formType报错就离谱; 更离谱的是,就这一个小的bug,github issues上能追溯到5月份之前;
所以这个库应该是死了
<AtForm>
        <AtInput
            required
            name="value"
            title="文本"
            type="text"
            placeholder="单行文本"
            :value="value"
            :onChange="handleChange"
        />
        <button formType="submit" :tag="onSubmit()">提交</button>
        <button formType="reset" :tag="onReset">重置</button>
    </AtForm>
这样写完全ok啊****
表单结合列表渲染不能通过 onSubmit 获取表单数据,怎么才能获取表单中每一个 Input 的值呢
这bug太扯了。可以先去掉这种描述啊...又不能用formType
同样被坑了的过来插个眼
俺也一样
俺也一样
俺也一样
俺也一样
一模一样
插个眼 打个野
我个人感觉这个组件就基本没实质性的用法,因为他官方都说了“开发者要获取数据,可以自行在页面的 state 中获取”。所以我认为taro-ui的form表单还没作到位吧
作者的原话是: 携带 form 中的数据触发 submit 事件,由于小程序组件化的限制,onSubmit 事件获得的 event 中的 event.detail.value 始终为空对象,开发者要获取数据,可以自行在页面的 state 中获取我想,可能他们考虑到把form可以包罗的成员情况都覆盖,会使得组件没有那么干净;覆盖一部分,也使用者改造更费劲,不如直接给白坯房,这样造起轮子简便。
把
<AtButton formType='submit'>提交</AtButton>改成<AtButton type={"primary"}>提交</AtButton>可以消除报错。 对我是生效的,你可以试试。你这样貌似没有触发 onsubmit 事件呀
你手动指明onClick就可以触发了呀
<AtButton type={"primary"} onClick={this.onSubmit} >提交</AtButton>这样的话好像并不是走的onSubmit,只是做了个点击事件,也拿不到表单内容了吧
是的,但是呢,因为我当前页面的变量都存在state里,所以只需要有事件告诉我交数据即可,变量我从state里获取。
可是这样submit出去会undefine,你知道怎么处理么?
<AtInput required name="value" title="文本" type="text" placeholder="单行文本" :value="value" :onChange="handleChange" /> <button formType="submit" :tag="onSubmit()">提交</button> <button formType="reset" :tag="onReset">重置</button> </AtForm>这样写完全ok啊****
这样就是受控组件了 个人对受控模式非常反感
您的邮件已收到!谢谢!