样式化的组件输入焦点

时间:2018-07-12 08:01:57

标签: reactjs styled-components

我正在尝试在安装组件时专注于输入。输入组件是样式组件,因此我使用innerRef来获取对该元素的引用。但是,安装组件时,输入不会获得焦点。我检查了该节点是否实际上正在获取对DOM节点的引用。我的逻辑找不到任何问题。谢谢您的帮助。

import React, { Component } from 'react';
import { findDOMNode } from 'react-dom';
import styled, { keyframes } from 'styled-components';

const UrlInput = styled.input`
  width: 400px;
  height: 34px;
  background-color: white;
  display: inline-block;
  outline: none;
  padding-left: 10px;
  font: 400 14px 'Source Sans Pro', 'sans-serif';
  ::placeholder {
    color: rgb(100,100,100);
    font: 400 14px 'Source Sans Pro', 'sans-serif';
  }
`

class AddUrl extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      url: ''
    }
    this.inputRef = React.createRef();
  }

  componentDidMount() {
    const node = findDOMNode(this.inputRef.current);
    node && node.focus();
  }


  render() {
    return(
      <AddUrlWrapper>
        <UrlInput placeholder={"Paste URL here"}
          innerRef={this.inputRef}
          type="text"
          value={this.state.url}
          onChange={(event) => this.setState({url: event.target.value})}/>
        <FetchButton>Fetch</FetchButton>
      </AddUrlWrapper>
    )
  }
}

3 个答案:

答案 0 :(得分:2)

对于样式化的组件,请使用道具console.log代替innerRef。从他们的文档here中获得了它。

文档示例:

ref

尝试一下,就可以了

答案 1 :(得分:1)

请尝试这个

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

const UrlInput = styled.input`
  background-color: white;
`;

class AddUrl extends React.Component {
  constructor(props) {
    super(props);
    this.inputRef = React.createRef();
  }

  componentDidMount() {
    if (this.inputRef.current) {
      this.inputRef.current.focus(); // This should work
    }
  }

  render() {
    return(
        <UrlInput innerRef={this.inputRef} />
    )
  }
}

如果您切换到React v16和样式化的组件v4,则可以使用ref代替innerRef

<UrlInput ref={this.inputRef} />

也请检查一下

  

对任何样式化组件的ref的本地支持,由于React v16而不再支持innerRef

https://medium.com/styled-components/announcing-styled-components-v4-better-faster-stronger-3fe1aba1a112

答案 2 :(得分:0)

setTimeout达到了目的。

  componentDidMount() {
    const node = findDOMNode(this.inputRef.current);
    setTimeout(() => node && node.focus(), 0);
  }