【问题标题】:How to not clear input field onClick如何不清除输入字段onClick
【发布时间】:2021-09-27 11:28:39
【问题描述】:

我正在使用 React JS,我想为“Row”类型的文本框制作一个隐藏按钮,这样当我点击该框时,侧面会出现说明,Row 有这个结构

 <div>
    <form key={id}>
        <button
          className="name"
          type="submit"
          onClick={clickFunc} 
        >
          {data.text}
        </button>
      </form>
  </div>

其中 clickFunc 调用 enterMouseFunc,在另一个组件文件中调用时传入的函数:

const clickFunc = useCallback((e) => {
    e.preventDefault();
    enterMouseFunc(e, data);
  });

在描述框中,有一个输入框,

// some other details here
<form key={id} onClick={inputClick}>
   <input
    type="text"
    className="inputParam"
    name={id}
    onChange={handleChange}
    />
   <button
    type="submit"
    style={{ display: "none" }}
    ></button>
</form>

我的输入点击:

const inputClick = (e) => {
    e.preventDefault();
  };

我的handleChange:

const handleChange = (e) => {
    e.preventDefault();
    setParameters({ name: e.target.name, value: e.target.value });
  };

效果很好。但是,每当我再次单击该行或在其他行之间切换时,所有用户的输入都会被清除。由于我已经禁止此行为,因此页面不会刷新,但输入仍会被删除。如何阻止它一直清除输入?

编辑: 这就是界面的样子,其中灰色框的类型为 Row。当我们单击这些框时,描述将出现在右侧,如图所示:

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您是否有机会触发表单的onSubmit?您阻止inputClick,但不阻止提交。但是,我不确定它会被调用。为什么有一个隐藏的提交按钮?

    【讨论】:

    • 如果我把类型改为“按钮”就不行了,在这种情况下,如果我在输入框中输入一些单词后按回车,整个页面会刷新。
    • 尝试在表单中添加一个 onSubmit,这会阻止默认值。
    • 它仍然不起作用,但我认为问题在于 Row 而不是描述中的输入字段。因为当我重新点击“行”框时才会发生这种情况
    • 按行是指 inputParam 输入字段?你能提供一个小提琴吗?
    • 不,实际上是 className="name" ,它是最顶部的代码。我包含了 UI 的快照,如果它有助于清除一点
    【解决方案2】:

    setParameters 是否包含所有字段值?如果是这样,您应该在重新分配名称和值之前复制现有值。如果不是,问题就出在其他地方。

    如果是这种情况,修复将如下所示:

    const handleChange = (e) => {
        e.preventDefault();
        setParameters({...parameters,  name: e.target.name, value: e.target.value});
      };
    
    

    【讨论】:

    • 我使用了 useReducer: `const [parameters, setParameters] = useReducer(formReducer, {});
    • formReducer 是:` const formReducer = (state, event) => { return { ...state, [event.name]: event.value, }; };`
    • 这对我来说很好 :( 祝你好运找到你的错误,我没有看到它。
    • 没问题。还是谢谢!
    【解决方案3】:

    除非您想提交表单,否则您不一定需要&lt;form&gt; 元素?

    此外,在该元素(而不是按钮)上有一个 click 事件处理程序并不常见,我并不完全惊讶它会导致副作用。

    我要做的是删除不提交的表单:仅在 change 事件上触发 setState/setReducer 的独立输入。

    那么你应该能够移除隐藏按钮、preventDefault 调用等。

    关于值的清理,我怀疑您在 key 属性中的 id 值发生了变化,这将导致重新挂载 form 子项。

    【讨论】:

    • 我也认为是 key prop 的问题导致了 value 的清理,但我不知道如何解决。你能给我一个解决方案吗?
    • 您需要分享更多代码,以便我了解id的值是如何计算的
    • 当我点击 Row 时,我将调用一个名为 renderDescription() 的函数,在该函数中我使用 shortid.generate() 生成一个 id,并将其传递到上面的输入中。我的 renderDescription 接受一组值,它将打印出来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2020-11-04
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多