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

在React ES6中,为什么输入字段在键入字符后会失去焦点?

吕高昂
2023-03-14

在我下面的组件中,输入字段在键入字符后失去焦点。当使用Chrome的Inspector时,看起来整个表单都在重新呈现,而不仅仅是输入字段的value属性。

我没有从eslint或Chrome Inspector得到任何错误。

提交表单本身的工作方式与实际输入字段的工作方式相同,当表单位于渲染的返回中或作为单独的组件导入时,而不是按照下面的编码方式。

为什么会这样?

主页组件

import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as actionPost from '../redux/action/actionPost';
import InputText from './form/InputText';
import InputSubmit from './form/InputSubmit';

class _PostSingle extends Component {
    constructor(props, context) {
        super(props, context);
        this.state = {
            post: {
                title: '',
            },
        };
        this.onChange = this.onChange.bind(this);
        this.onSubmit = this.onSubmit.bind(this);
    }
    onChange(event) {
        this.setState({
            post: {
                title: event.target.value,
            },
        });
    }
    onSubmit(event) {
        event.preventDefault();
        this.props.actions.postCreate(this.state.post);
        this.setState({
            post: {
                title: '',
            },
        });
    }
    render() {
        const onChange = this.onChange;
        const onSubmit = this.onSubmit;
        const valueTitle = this.state.post.title;
        const FormPostSingle = () => (
            <form onSubmit={onSubmit}>
                <InputText name="title" label="Title" placeholder="Enter a title" onChange={onChange} value={valueTitle} />
                <InputSubmit name="Save" />
            </form>
        );
        return (
            <main id="main" role="main">
                <div className="container-fluid">
                    <FormPostSingle />
                </div>
            </main>
        );
    }
}

_PostSingle.propTypes = {
    actions: PropTypes.objectOf(PropTypes.func).isRequired,
};

function mapStateToProps(state) {
    return {
        posts: state.posts,
    };
}

function mapDispatchToProps(dispatch) {
    return {
        actions: bindActionCreators(actionPost, dispatch),
    };
}

export default connect(mapStateToProps, mapDispatchToProps)(_PostSingle);

文本输入组件

import React, { PropTypes } from 'react';

const InputText = ({ name, label, placeholder, onChange, value, error }) => {
    const fieldClass = 'form-control input-lg';
    let wrapperClass = 'form-group';
    if (error && error.length > 0) {
        wrapperClass += ' has-error';
    }
    return (
        <div className={wrapperClass}>
            <label htmlFor={name} className="sr-only">{label}</label>
            <input type="text" id={name} name={name} placeholder={placeholder} onChange={onChange} value={value} className={fieldClass} />
            {error &&
                <div className="alert alert-danger">{error}</div>
            }
        </div>
    );
};

InputText.propTypes = {
    name: PropTypes.string.isRequired,
    label: PropTypes.string.isRequired,
    placeholder: PropTypes.string.isRequired,
    onChange: PropTypes.func.isRequired,
    value: PropTypes.string,
    error: PropTypes.string,
};

InputText.defaultProps = {
    value: null,
    error: null,
};

export default InputText;

提交按钮组件

import React, { PropTypes } from 'react';

const InputSubmit = ({ name }) => {
    const fieldClass = 'btn btn-primary btn-lg';
    return (
        <input type="submit" value={name} className={fieldClass} />
    );
};

InputSubmit.propTypes = {
    name: PropTypes.string,
};

InputSubmit.defaultProps = {
    name: 'Submit',
};

export default InputSubmit;

共有3个答案

湛功
2023-03-14

发生的事情是这样的:

当onChange事件触发时,回调调用setState,并使用新的title值,该值作为道具传递到文本字段。此时,React会呈现一个新的组件,这就是您失去焦点的原因。

我的第一个建议是提供组件键,特别是表单和输入本身。关键点允许React通过渲染保留组件的标识。

编辑:

请参阅有关密钥的文档:https://reactjs.org/docs/lists-and-keys.html#keys

梁磊
2023-03-14

原因如下:

我正在使用文本字段中的键。在同一区块内;我有一个输入字段来更新同一文本字段的值。现在,由于组件键正在更改,react将重新呈现UI。因此失去了焦点。

从中得到什么:

不要使用不断变化的钥匙。

通令
2023-03-14

这是因为你正在渲染一个函数中的表单。

每次你的状态/prop改变,函数返回一个新的形式。它导致你失去焦点。

尝试将函数中的内容直接放入渲染中。

<main id="main" role="main">
    <div className="container-fluid">
        <FormPostSingle />
    </div>
</main>

===

<main id="main" role="main">
    <div className="container-fluid">
        <form onSubmit={onSubmit}>
            <InputText name="title" label="Title" placeholder="Enter a title" onChange={onChange} value={valueTitle} />
            <InputSubmit name="Save" />
        </form>
    </div>
</main>
 类似资料:
  • 问题内容: 我正在制作动态表格。一个有值的列表。每个值由一个字符串表示。 我的组件中有一个函数,可以向该字段添加新值。 值和按钮在我的HTML中这样显示。 一旦我在值的输入中写入一些文本,输入就会失去焦点。如果我在一个字段中添加了多个值,并且在一个输入值中写入了一个字符,则该输入将失去焦点,并且该字符将写入每个输入中。 问题答案: 当数组是原始类型(在您的情况下是数组)时,会发生这种情况。这可以通

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

  • 我正在使用Office Fabric UI React组件,如果用户输入逗号字符,我希望将文本输入切换为多行文本。我可以让这部分工作,但是当输入在单行和多行输入之间切换时,它会失去焦点。因此,如果在文本字段中键入并键入逗号字符,文本字段将失去焦点。我相信,当我在两者之间切换时,office fabric react中的textfield组件会重新呈现一个textarea来代替输入,而焦点将保留在替

  • 问题内容: 我有以下html5输入元素: 为什么此输入允许在输入字段中输入字符“ e”?没有其他字母字符可以输入(按预期方式) 使用chrome v.44.0.2403.107 问题答案: 因为这正是规范所说的应该工作的方式。输入的数字可以接受浮点数,包括负号和或字符(其中指数是或后面的数字): 浮点数按以下顺序由以下部分组成: 可选地,第一个字符可以是“ ”字符。 “ ” 范围内的一个或多个字符

  • 问题内容: 我正在使用模糊验证。在将第一个字符输入输入元素后,它失去了焦点,我必须再次单击它才能继续输入。它仅对第一个字符执行此操作。后续字符类型仍然是重点。这是我的基本登录表单示例: 问题答案: 发生这种情况是因为您每次渲染时都将其重新定义为新组件,这意味着它看起来像React 的 新 组件,因此它将卸载原始组件并重新安装新组件。 您需要将其提升:

  • 我正在使用构建组件,其中我有一个文本字段列表。 我在redux中存储数据。 每个保留每个