当前位置: 首页 > 知识库问答 >
问题:

在modal中键入后反应输入丢失状态

计均
2023-03-14

我有一个模式,用户需要填写他的电子邮件广告。问题是输入字段在每次键入字母后都会失去状态。

父组件:

const { show: openExampleMailingModal, ExampleMailingModal } = useExampleMailingHook(mailable);

<ExampleMailingModal />

示例MailingModal:

import React, { useState } from 'react';
import Modal from '@/crm/Shared/Modals/Modal';
import TextInput from '@/crm/Shared/TextInput';

export const useExampleMailingHook = (mailable) => {
    const [isVisible, setIsVisible] = useState(false);
    const [email, setEmail] = useState('');

    const show = () => setIsVisible(true);
    const hide = () => setIsVisible(false);

    const ExampleMailingModal = () => (
        <>
            {isVisible && (
                <Modal close={hide}>
                    <>
                        <TextInput
                            key="test123"
                            name="email"
                            placeholder="Email"
                            value={email}
                            onChange={(e) => setEmail(e.target.value)}
                        />
                    </>
                </Modal>
            )}
        </>
    );

    return {
        show,
        hide,
        ExampleMailingModal,
    };
};

文本输入:

import React from 'react';

export default ({ label, name, className, type = 'text', errors = [], ...props }) => {
    return (
        <div className={className}>
            {label && (
                <label htmlFor={name} className="block text-sm font-medium text-gray-700">
                    {label}
                </label>
            )}
            <input
                id={name}
                name={name}
                type={type}
                {...props}
                className={`mt-1 block w-full border border-gray-300 rounded-md shadow-sm py-2 px-3 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm ${
                    errors.length ? 'border-red-500' : ''
                }`}
            />
            {errors && <div className="text-red-500 text-sm mt-1">{errors}</div>}
        </div>
    );
};

我在其他几个地方使用输入字段。但在我的模态中,它不是。我做错了什么?

共有1个答案

束建章
2023-03-14

在每个渲染周期中,您都声明了一个新的asspleMailingModal,因此旧的一个被卸载,一个新的实例被挂载。这就是为什么每次重新渲染后都会失去焦点。

ExampleMailingModal组件移到钩子之外,这样它就不会被重新声明,并返回JSX。

const ExampleMailingModal = ({ isVisible, hide, ...inputProps }) =>
  isVisible ? (
    <Modal close={hide}>
      <TextInput
        key="test123"
        name="email"
        placeholder="Email"
        {...inputProps}
      />
    </Modal>
  ) : null;

const useExampleMailingHook = (mailable) => {
  const [isVisible, setIsVisible] = useState(false);
  const [email, setEmail] = useState("");

  const show = () => setIsVisible(true);
  const hide = () => setIsVisible(false);

  return {
    show,
    hide,
    ExampleMailingModal: (
      <ExampleMailingModal
        isVisible={isVisible}
        hide={hide}
        value={email}
        onChange={(e) => setEmail(e.target.value)}
      />
    )
  };
};

用法:

const { show, hide, ExampleMailingModal } = useExampleMailingHook();

...

{ExampleMailingModal}
 类似资料:
  • 我遇到了一个奇怪的错误,我的搜索输入组件,它失去了对每个按键的关注,不知道为什么。 我还得到了一个

  • 我在提交复合组件方面有问题。 我的大多数复合组件都包含输入组件和“提交”按钮。当我试图将按钮仍然放在相同的h:form中但不放在相同的复合组件中时,提交的值似乎“丢失”在某个地方。例如,我的验证器被调用原始值。 不起作用。当我调试我的验证器时,我可以看到修改的值甚至没有提交。getLocalValue、getSubmittedValue和getValue均未更改。 复合组件声明中有语法可以用来纠正

  • 我已经用ReactJS和ES6进行了几天的实验,并创建了两个组件,即

  • 我遇到了一个非常奇怪的问题,我无法理解。我目前正在使用一个创建反应应用程序,使用反应16.3和Antd 3.11框架,我已经创建了一个表,在它的标题列中呈现一个带有onChange事件的组件。 当我第一次聚焦输入时,问题就出现了。 我在第一个关键事件上失去了焦点,之后当我再次单击该字段时,它将保持焦点,直到我单击其他内容。 下面是我一直在使用的例子:https://ant.design/compo

  • 在我下面的组件中,输入字段在键入字符后失去焦点。当使用Chrome的Inspector时,看起来整个表单都在重新呈现,而不仅仅是输入字段的value属性。 我没有从eslint或Chrome Inspector得到任何错误。 提交表单本身的工作方式与实际输入字段的工作方式相同,当表单位于渲染的返回中或作为单独的组件导入时,而不是按照下面的编码方式。 为什么会这样? 主页组件 文本输入组件 提交按钮

  • 问题内容: 我面临一个相当愚蠢的问题。我正在创建我的第一个React应用程序,遇到一个小问题,提交表单后,我无法清除输入值。尝试谷歌搜索此问题,在这里找到了一些类似的线程,但我无法解决。我不想更改组件/应用程序的状态,而只是将输入的值更改为空字符串。我尝试清除函数中输入的值,但出现错误: “无法设置未定义的属性’值’”。 我的SearchBar组件: 问题答案: 您有一个受控组件,其值由决定。因此