【问题标题】:React Hook to update State Variable in a Function callReact Hook 在函数调用中更新状态变量
【发布时间】:2020-04-11 06:43:50
【问题描述】:

所以我有一个钩子,可以在更改时获取输入字段值并设置变量。

更新

HooksLib.js

 import { useState } from "react";

export function useFormFields(initialState) {
  const [fields, setValues] = useState(initialState);

  return [
    fields,
    function(e, name = '') {
      if (e instanceof Object && e.target instanceof Object) {
        // Safe to assume it was an event passed in
        setValues({ ...fields, [e.target.id]: e.target.value });
      } else {
        // Assume the value was passed in directly
        setValues({ ...fields, [name]: e });
      }
    }
  ];
}

我想使用同一个钩子在函数调用中设置一个变量。我该怎么做呢?

如何将 event.target.id 和 event.target.value 添加到函数调用中?

我想添加它的函数在下面....特别是///then update a variable called "fields.customerId" as the value of "customer"所在的位置。

handleSignUpSubmit 异步函数

const [fields, handleFieldChange] = useFormFields({
    name: "",
    email: "",
    customerId: "null"
  });

async function handleSignUpSubmit(event) {
    event.preventDefault();



    setIsLoading(true);

    try {
      const customer = await createCustomer({ email: fields.email, name: fields.name});
      ///then update a variable called "fields.customerId" as the value of "customer"
    } catch (e) {
      alert(e.message);
      setIsLoading(false);
    }
}

感谢您的帮助!

【问题讨论】:

    标签: javascript reactjs react-native react-hooks react-functional-component


    【解决方案1】:

    如果我正确理解您的问题,我会看到两个选项。

    您可以制作一个类似于事件的对象并将其传入:

    const myEvent = {
      target: {
        id: 'test',
        value: 'test2'
      }
    }
    
    ...
    
    handleFieldChange(myEvent);
    

    或者另一种方法是在自定义钩子中包含一个检查,以允许使用键名作为可选参数传入事件或普通值:

    function(e, name = '') {
      if (e instanceof Object && e.target instanceof Object) {
        // Safe to assume it was an event passed in
        setValues({ ...fields, [e.target.id]: e.target.value });
      } else {
        // Assume the value was passed in directly
        setValues({ ...fields, [name]: e });
      }
    }
    

    然后这样称呼它:

    const customer = await createCustomer({ email: fields.email, name: fields.name});
    handleFieldChange(customer, 'customerId');
    

    【讨论】:

    • 嘿,非常感谢布赖恩!我的钩子应该看起来像这样来执行检查吗?更新了顶部的挂钩。
    • 是的,我认为这看起来是正确的。如果它没有按预期工作,请告诉我,但我自己使用的东西几乎完全一样
    • 它用于传递输入字段的值,但我很难让它传递 customer 对象,这是一个返回的客户 ID 号,我试图使用它发布到数据库fields.customerId 但它没有出现。我想知道我是否引用错了?
    • createCustomer 究竟返回了什么?只是身份证?
    • 是的,它只是返回我存储在我的数据库中的条带客户 ID,以便我以后可以引用它。几乎就像const [fields, handleFieldChange] = useFormFields({ customerId: "" }); 没有填充一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2020-03-03
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多