Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

react-native 组件 某state更新再次 触发Form render 方法后, 二次 点击 submit 收集的值变位空 #11473

Closed
supermaverickws opened this issue Mar 18, 2022 · 20 comments · Fixed by #11501
Assignees
Labels
enhancement New feature or request T-rn Target - 编译到 React Native

Comments

@supermaverickws
Copy link

这个特性解决了什么问题?

react-native 组件 某state更新后 Form 二次 触发 submit 收集的值变位空

原因是。外面组件state 更新后,好像触发了 Form 组件的 bindValueChangeEvent 方法。
如果外面没有把第一次收集的值 设置到 value 属性里。 就会重置 Form 组件的 formValues 里对应的值。
如果加个是否 value !== undifend 判断的话,就正常,
image

@taro-bot2 taro-bot2 bot added the enhancement New feature or request label Mar 18, 2022
@github-actions
Copy link
Contributor

@supermaverickws supermaverickws changed the title react-native 组件 某state更新后 Form 二次 触发 submit 收集的值变位空 react-native 组件 某state更新再次 触发Form render 方法后, 二次 点击 submit 收集的值变位空 Mar 18, 2022
@supermaverickws
Copy link
Author

@zhiqingchen

@zhiqingchen zhiqingchen added the T-rn Target - 编译到 React Native label Mar 18, 2022
@zhiqingchen zhiqingchen self-assigned this Mar 18, 2022
@zhiqingchen
Copy link
Member

可否提供相应复现代码片段

@zhiqingchen
Copy link
Member

表单项value变更,不应该更新一下对应属性?

@supermaverickws
Copy link
Author

supermaverickws commented Mar 21, 2022

@zhiqingchen
你输入任意值后。点击按钮 提交两次 。
第一次 正常。 第二次就变为空了

export default function TestFormSubmitTwice(){
    const [input, setInput] = useState();
  
    return <Form onSubmit={value => {
        setInput(value.detail.value?.code || "无")
        Taro.showToast({ title : JSON.stringify(value.detail.value || "无数据")})
    }}>
        <Label>{input}</Label>
       <Input  name="code" placeholder={"请输入"} />
       <Button
                        type="primary"
                        formType="submit"
                        >
                        {"提交, 第二次提交时, code值被重置"}
                    </Button>
    </Form>
  }

@zhiqingchen
Copy link
Member

建议加上value属性

import { useState } from 'react'
import {Form, Label, Button, Input} from '@tarojs/components'
import Taro from '@tarojs/taro'

export default function TestFormSubmitTwice() {
  const [input, setInput] = useState();
  const [v, setV] = useState('')

  return (
    <Form
      onSubmit={value => {
        setInput(value.detail.value?.code || "无");
        Taro.showToast({
          title: JSON.stringify(value.detail.value || "无数据")
        });
      }}
    >
      <Label>{input}</Label>
      <Input name="code" value={v} onInput={({detail}) => {
        setV(detail.value)
      }} placeholder="请输入"
      />
      <Button type="primary" formType="submit">
        提交, 第二次提交时, code值被重置
      </Button>
    </Form>
  );
}

@supermaverickws
Copy link
Author

@zhiqingchen 可以加这个属性。
但是感觉没必要加。 input 组件太多的话。每个都要写重复的value。
而源码里面只要判断下是否是 undined 就行。

@supermaverickws
Copy link
Author

@zhiqingchen 但是最终要考虑app端、小程序端、H5 端 Form 组件行为一致性。

@supermaverickws
Copy link
Author

如果其他端也是同样的逻辑。可以不加。然后你可以关闭此提问。
如果其他端不是此逻辑的话。建议还是修复下。

@zhiqingchen
Copy link
Member

你提的是对的,只是这么改有个小问题,可能有设置value为undefined的场景。

@zhiqingchen
Copy link
Member

建议你先打patch解决自身业务问题,此处改动还需要再思考下🤔。

@supermaverickws
Copy link
Author

好的。

@supermaverickws
Copy link
Author

你看这样是不是可以。
你可以再加一个 集合属性。 缓存input组件的 name-value
每次判断是否和上一个value 是否相同。相同就忽略。不同就更新
就是每次变动,做下diff 操作。
image

@zhiqingchen
Copy link
Member

还是判断 undefined 吧

@supermaverickws
Copy link
Author

@zhiqingchen
Copy link
Member

@supermaverickws 有遇到生产环境下,收集不到form的数据吗

@zhiqingchen
Copy link
Member

#11547

@zhiqingchen
Copy link
Member

release 还是 debug

@zhiqingchen
Copy link
Member

如果是其他问题,另外提供issue吧

@taoWcode
Copy link

哈哈,我这边只是提醒下,这个issue的表单使用者也可能遇到这个问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request T-rn Target - 编译到 React Native
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants