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

React输入文本在重新渲染器上失去焦点

淳于飞鸾
2023-03-14

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

从文档:

请注意,在未来的React中,可能会将ashidComponentUpdate()视为提示而不是严格的指令,返回false可能仍然会导致组件的重新渲染。

代码:

export class TextInput extends React.Component {
  constructor(props) {
    super();
    this.storePath = props.value;
    const value = dataStore.get(this.storePath) || '';
    this.state = { value };
  }

  shouldComponentUpdate() { return false; }

  update(event) {
    dataStore.update(this.storePath, event.target.value);
  }

  render() {
    return <input type="text" value={this.state.value} onChange={e => this.update(e)}/>;
  }
}

编辑

我正在使用react路由器。

const App = props => (
  <Router history={browserHistory}>
    <div>
      <Switch>{
        Array.from(this.routeMap.keys()).map(path => {
          const viewFn = this.routeMap.get(path);
          return <Route key={path} path={path} render={viewFn}></Route>;
        })
      }</Switch>
    </div>
  </Router>
);

有一个顶级组件通过路由拉入,它使用my TextInput组件。

共有1个答案

李敏学
2023-03-14

我找到了。每次我调用ReactDOM。render我正在重新说明我的顶级组件函数,这似乎导致我的输入文本失去焦点。它必须对传递的组件函数/类进行身份检查,以查看它是否与前一个相同,如果与前一个相同,则完全从头开始重新加载。

因此,以下是如何避免这样做:

const render = props => {
  const App = props => (
    <Router history={browserHistory}>
      <Switch>
        <Route key="/login" path="/login" render={() => View(props)}/>
      </Switch>
    </Router>
  );
  ReactDOM.render(
    <App {...props}/>,
    rootDiv
  );
}

render();
render();

在此处输入JSIDLE:https://jsfiddle.net/chwsmchd/

以下是正确的方法:

const App = props => (
  <Router history={browserHistory}>
    <Switch>
      <Route key="/login" path="/login" render={() => View(props)}/>
    </Switch>
  </Router>
);

const render = props => {
  ReactDOM.render(
    <App {...props}/>,
    rootDiv
  );
}

render();
render();

正确的JSIDLE:https://jsfiddle.net/gzzpmpbz/

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

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

  • 我有一个带有文本输入的React(15.3.2)组件。 (无论我在哪里说“渲染”,实际上都是渲染或取消隐藏;我已经尝试了两者。) 当输入元素模糊时,我使用文本输入渲染一个新组件。 我想给新的文本输入焦点。 我尝试了,,以及;我尝试了命名和函数s;我试过了。 聚焦本身是工作的,例如,一旦它被渲染,如果我点击初始输入,焦点会转移到新输入(这是一个错误,但与聚焦相比,微不足道)。 第一个输入有一个,它设

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

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

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