【问题标题】:In react JS fields losing focus after first onChange在第一次 onChange 后反应 JS 字段失去焦点
【发布时间】:2017-09-12 09:00:04
【问题描述】:

我正在使用 redux-form 但是当我开始打字时,焦点第一次在反应中熄灭。

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

请看下面的代码:

<Field
        name='description'
       // onChange={this.handleChange.bind(this)}
        //value={this.state.description}
        component={props => {
          return (
            <MentionTextArea  {...props} userTags={userTags} tags={postTags}/> 
          )
        }}

MentionTextArea 组件:

import React, {Component, PropTypes} from 'react'
import { MentionsInput, Mention } from 'react-mentions'
import defaultStyle from './defaultStyle'

class MentionTextArea extends Component {
    constructor(props) {
        super(prop)
    }
    handleOnChange (e) {
        this.props.input.onChange(e.target.value); 
    }
    render() {
       // const { input, meta, ...rest } = this.props;
        return (
            <MentionsInput 
                value={this.props.input.value || ''}
                onChange={this.handleOnChange.bind(this)}
                singleLine={false}
                style={ defaultStyle }
                markup="@[__display__](__type__:__id__)"
                >
                   <Mention trigger="@"
                        data={this.props.userTags}
                        type="userTags"
                        style={{ backgroundColor: '#d1c4e9' }}
                        renderSuggestion={ (suggestion, search, highlightedDisplay) => (
                            <div className="user">
                                { highlightedDisplay }
                            </div>
                        )}
                    />
                    <Mention trigger="#"
                        data={this.props.tags}
                        type="tags"
                        style={{ backgroundColor: '#d1c4e9' }}
                        renderSuggestion={ (suggestion, search, highlightedDisplay) => (
                            <div className="user">
                                { highlightedDisplay }
                            </div>
                        )}
                    />
            </MentionsInput>
        );
    }
}

export default MentionTextArea

请帮忙!

提前致谢,

【问题讨论】:

  • 你能展示一下你是如何渲染表单的吗
  • { return () }}
    let connection = connect(mapStateToProps, mapDispatchToProps) var reduxConnectedComponent = connection(CreatePostForm) export default reduxForm({ form: 'CreatePost' // 此表单的唯一标识符 })(reduxConnectedComponent)
  • 您是否在某处提供了唯一生成的密钥。也可以试试let connection = connect(mapStateToProps, mapDispatchToProps) var reduxConnectedComponent = reduxForm({ form: 'CreatePost' // a unique identifier for this form }) export default connection(reduxConnectedComponent)
  • 我是 reactJS 的新手,能否请您提供链接或指导我们需要在哪里添加密钥?

标签: reactjs redux react-redux redux-form


【解决方案1】:

对于刚接触 redux-form 的人来说这是一个常见的问题,请查看此issue 你会在那里找到答案。

您必须在您的 render() 方法之外定义无状态函数,否则它将在每次渲染时重新创建,并会强制 Field 重新渲染,因为它的组件属性会不同。来自官方redux-form documentation的例子:

// outside your render() method
const renderField = (field) => (
    <div className="input-row">
      <input {...field.input} type="text"/>
      {field.meta.touched && field.meta.error && 
       <span className="error">{field.meta.error}</span>}
    </div>
  )

// inside your render() method
<Field name="myField" component={renderField}/>

【讨论】:

  • 什么不行,你使用箭头函数来创建 MentionTextArea。你不能这样做。这是在每次渲染上构造一个新的组件函数。因此,您的输入失去焦点是正常行为。查看文档中的example 并重写您的代码。
  • 嗨!您应该总结链接页面的内容以及当前问题的相关信息。万一链接失效,对以后的读者来说会更好。
  • 好的,我会的。
猜你喜欢
  • 2019-05-15
  • 2021-01-29
  • 2021-10-27
  • 1970-01-01
  • 2011-10-13
  • 2019-12-19
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多