【问题标题】:How to submit a form using a function? React Native如何使用函数提交表单?反应原生
【发布时间】:2021-12-03 05:46:37
【问题描述】:

我想在停止输入时提交一个表单,我正在使用 react hook 表单并在函数中调用 handleSubmit 并且它不起作用,请帮助我,这是我的代码,我正在做一个地图这段代码,我试过用 ref 但它不起作用。这是我的组件。

import React, {useRef} from 'react';
import {View, Text, TextInput, TouchableOpacity} from 'react-native';
import tailwind from 'tailwind-rn';
import {useDebounce} from 'use-debounce';
import {useForm, Controller} from 'react-hook-form';
import {MAIN_COLOR, GRAY} from '../../constants/theme';

function RegisterFormHook({data, onSubmit, control, errors}) {
  const [underlineColor, setUnderlineColor] = React.useState(GRAY);
  const [field, setField] = React.useState('');
  const [value] = useDebounce(field, 1000);
  const inputElement = useRef();

  const {handleSubmit} = useForm();

  React.useEffect(() => {
    if (value.length !== 0) {
      handleSubmit(onSubmit({[data.name]: value}));
    }
    console.log(errors);
  }, [value]);

  const onFocus = () => {
    setUnderlineColor(MAIN_COLOR);
  };

  const onBlur = () => {
    setUnderlineColor(GRAY);
  };

  return (
    <View style={tailwind('px-8')}>
      <Controller
        control={control}
        name={data.name}
        rules={data.rules}
        render={({field: {onChange, value}}) => (
          <TextInput
            placeholder={data.placeholder}
            ref={inputElement}
            style={[
              tailwind('text-black p-0 text-xl pb-1 flex-row'),
              {
                borderBottomWidth: 1,
                borderBottomColor: underlineColor,
              },
            ]}
            onChangeText={value => {
              onChange(value);
              setField(value);
            }}
            onBlur={onBlur}
            value={value}
            onFocus={() => onFocus()}
          />
        )}
      />
      <Text>{errors[data.name]?.message}</Text>
    </View>
  );
}

export default RegisterFormHook;

我想在 useEffect 中提交,但它只在我按下按钮时起作用。

【问题讨论】:

  • 您想在用户停止输入时提交输入的文本,例如3 秒。不离开文本输入焦点或按回车或关闭软件键盘?
  • 是的,不离开文本输入焦点,就在用户停止输入时

标签: forms react-native react-hook-form debounce


【解决方案1】:

这里是sample 在输入完成后如何执行预定操作:

import * as React from 'react';
import { TextInput, View, StyleSheet, Alert } from 'react-native';
import Constants from 'expo-constants';

// or any pure javascript modules available in npm
import { Card } from 'react-native-paper';

export default function App() {
  let timer = React.useRef();
  const [text, setText] = React.useState('');

  React.useEffect(() => {
    if (text) {
      timer = setTimeout(() => {
        Alert.alert('TEXT : ' + text);
      }, 3000);
    }
  }, [text]);

  return (
    <View style={styles.container}>
      <Card>
        <TextInput
          placeholder={'Enter the tetxt'}
          onChange={(e) => {
            clearTimeout(timer);
            setText(e.nativeEvent.text);
          }}
        />
      </Card>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
  },
});

【讨论】:

  • 我在示例中提供的组件可以做到这一点,但是我不能调用react钩子形式的handleSubmit,必须在一个按钮中但我需要它处于useEffect状态,我可以'找不到任何解决方案:/
  • 已尝试但无法重现此问题,您可以签出snack.expo.dev/@m.bahl/0be0de 吗?
  • 我会试试的,谢谢哥们
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 2021-09-14
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2021-08-18
相关资源
最近更新 更多