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

反应js-重新渲染时输入失去焦点

淳于坚壁
2023-03-14

我正在编写文本输入,并在onChange事件中调用setState,因此React重新呈现我的UI。问题是文本输入总是失去焦点,所以我需要为每个字母重新聚焦:D。

var EditorContainer = React.createClass({

    componentDidMount: function () {
        $(this.getDOMNode()).slimScroll({height: this.props.height, distance: '4px', size: '8px'});
    },

    componentDidUpdate: function () {
        console.log("zde");
        $(this.getDOMNode()).slimScroll({destroy: true}).slimScroll({height: 'auto', distance: '4px', size: '8px'});
    },

    changeSelectedComponentName: function (e) {
        //this.props.editor.selectedComponent.name = $(e.target).val();
        this.props.editor.forceUpdate();
    },

    render: function () {

        var style = {
            height: this.props.height + 'px'
        };
        return (
            <div className="container" style={style}>
                <div className="row">
                    <div className="col-xs-6">
                    {this.props.selected ? <h3>{this.props.selected.name}</h3> : ''}
                    {this.props.selected ? <input type="text" value={this.props.selected.name} onChange={this.changeSelectedComponentName} /> : ''}
                    </div>
                    <div className="col-xs-6">
                        <ComponentTree editor={this.props.editor} components={this.props.components}/>
                    </div>
                </div>
            </div>
        );
    }

});

共有3个答案

颛孙建业
2023-03-14

如果是react路由器内的问题

<Route path="/user" render={() => <UserPage/>} />

失去焦点是因为组件prop每次都使用React.createElement,而不仅仅是重新呈现更改。

详情如下:https://reacttraining.com/react-router/web/api/Route/component

花品
2023-03-14

我一次又一次地回到这里,最后总是在别处找到解决问题的办法。所以,我将在这里记录它,因为我知道我会再次忘记它!

在我的案例中,input失去焦点的原因是我在状态更改时重新呈现了input

import React from 'react';
import styled from 'styled-components';

class SuperAwesomeComp extends React.Component {
  state = {
    email: ''
  };
  updateEmail = e => {
    e.preventDefault();
    this.setState({ email: e.target.value });
  };
  render() {
    const Container = styled.div``;
    const Input = styled.input``;
    return (
      <Container>
        <Input
          type="text"
          placeholder="Gimme your email!"
          onChange={this.updateEmail}
          value={this.state.email}
        />
      </Container>
    )
  }
}

所以,问题是我总是在一个地方开始编写所有代码,以便快速测试,然后将其分解为单独的模块。但是,在这里,这种策略适得其反,因为在输入更改时更新状态会触发渲染函数,而焦点会丢失。

修复很简单,从一开始就进行模块化,换句话说,“将输入组件移出渲染功能”

import React from 'react';
import styled from 'styled-components';

const Container = styled.div``;
const Input = styled.input``;

class SuperAwesomeComp extends React.Component {
  state = {
    email: ''
  };
  updateEmail = e => {
    e.preventDefault();
    this.setState({ email: e.target.value });
  };
  render() {
    return (
      <Container>
        <Input
          type="text"
          placeholder="Gimme your email!"
          onChange={this.updateEmail}
          value={this.state.email}
        />
      </Container>
    )
  }
}

参考解决方案:https://github.com/styled-components/styled-components/issues/540#issuecomment-283664947

左康安
2023-03-14

没有看到代码的其余部分,这只是猜测。创建EditorContainer时,请为组件指定唯一键:

当重新渲染发生时,如果看到相同的键,这将告诉React不要重击并重新生成视图,而是重用。那么聚焦的项目应该保留焦点。

 类似资料:
  • 我正在使用react,希望输入文本显示内存数据存储中的值,然后在值更改时更新存储,从而触发重新渲染。我看到的问题是,我的输入文本在重读时失去了焦点。我已经尝试设置key属性,覆盖shouldComponentUpdate并返回false,以防止react重新为组件命名,但没有效果。不管怎样,后者似乎不是一个好的长期解决方案。 从文档: 请注意,在未来的React中,可能会将ashidCompone

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

  • 问题内容: 呈现组件后,将焦点设置在特定文本字段上的反应方式是什么? 文档似乎建议使用引用,例如: 在渲染函数中的输入字段上进行设置,然后调用: 但是我应该在哪里称呼它呢?我已经尝试了几个地方,但无法正常工作。 问题答案: 您应该这样做,而不是。像这样

  • 在阅读了React设置焦点和带有超时的React焦点后,我仍然有点困惑,在输入上设置的正确跨浏览器选项是什么。 我有一个问题与条件渲染输入可能有焦点后渲染在,其中放置在。 1)解决方案与组件didUpdate: 此解决方案适用于Chrome、IE11、Edge,但不适用于最新的Firefox(单击后,输入事件不会出现)。 2)解决方案与请求动画帧: 该解决方案适用于Chrome、IE11、Edge

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

  • 在我的活动中,我有一个editText字段。当用户点击它时,editText获得焦点并出现键盘。现在,当用户按下手机上的硬件后退按钮时,键盘会消失,但光标仍保留在Edittext中,即它仍然具有焦点。当按下后退按钮时,是否有可能使EditText失去焦点?我尝试使用以下代码,但它不起作用: