gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:58:09 24 4
gpt4 key购买 nike

在下面的组件中,输入字段在输入字符后失去焦点。使用 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;

最佳答案

这是因为您正在 render() 内部的函数中渲染表单。

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

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

<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>

关于reactjs - 在React ES6中,为什么输入字段在输入字符后失去焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42573017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com