Comment sélectionner tout le texte en entrée avec Reactjs, quand il s'est concentré?

92

Par exemple: codepen

var InputBox = React.createClass({
  render: function() {
    return (
      <input className="mainInput" value='Some something'></input>
    )
  }
});
Alexander Shtang
la source

Réponses:

188

Functional component:

const handleFocus = (event) => event.target.select();
const Input = (props) => <input type="text" value="Some something" onFocus={handleFocus} />

ES6 class component:

class Input extends React.Component {
    handleFocus = (event) => event.target.select();

    render() {
        return (
            <input type="text" value="Some something" onFocus={this.handleFocus} />
        );
    }
}

React.createClass:

React.createClass({
    handleFocus: function(event) {
      event.target.select();
    },

    render: function() {
      return (
        <input type="text" value="Some something" onFocus={this.handleFocus} />
      );
    },
})
dschu
la source
1
cela fonctionne en fonction pure (pas de classe), merci pour cette solution.
Jan Jarčík
11
Peut être simplifié davantage sans avoir besoin de la fonction supplémentaire dans le cas où ce n'est que pour un champ de la classe:<input type='text' value='Some something' onFocus={e => e.target.select()} />
TK123
4
@ TK123 Vous devez éviter les fonctions fléchées dans vos méthodes de rendu . Il viole également jsx-no-bind qui est utilisé par eslint-config-airbnb par exemple.
dschu
1
Comment faire fonctionner cela pour une disabledzone de texte? jsfiddle.net/69z2wepo/317733
Rahul Desai
3
@RahulDesai Au lieu de disabled, utilisez readOnly: jsfiddle.net/kxgsv678
dschu
5
var InputBox = React.createClass({
  getInitialState(){
    return {
      text: ''
    };
  },
  render: function () {
    return (
      <input
        ref="input"
        className="mainInput"
        placeholder='Text'
        value={this.state.text}
        onChange={(e)=>{this.setState({text:e.target.value});}}
        onFocus={()=>{this.refs.input.select()}}
      />
    )
  }
});

Vous devez définir ref sur l'entrée et lorsque vous vous concentrez, vous devez utiliser select ().

obreja catalin
la source
5

Merci, je l'apprécie. Je l'ai fait ainsi:

var input = self.refs.value.getDOMNode();
            input.focus();
            input.setSelectionRange(0, input.value.length);
Alexander Shtang
la source
1

Dans mon cas, je voulais sélectionner le texte depuis le début après l'apparition de l'entrée dans le modal:

componentDidMount: function() {
    this.refs.copy.select();
},

<input ref='copy'
Lukas Lukac
la source
0
var React = require('react');

var Select = React.createClass({
    handleFocus: function(event) {
        event.target.select()
    },
    render: function() {
        <input type="text" onFocus={this.handleFocus} value={'all of this stuff'} />
    }
});

module.exports = Select;

Sélection automatique de tout le contenu d'une entrée pour une classe de réaction. L'attribut onFocus sur une balise d'entrée appellera une fonction. La fonction OnFocus a un paramètre appelé événement généré automatiquement. Comme indiqué ci-dessus, event.target.select () définira tout le contenu d'une balise d'entrée.

Kylo Jorgensen
la source
0

Un autre composant fonctionnel avec useRefHook:

const inputEl = useRef(null);

function handleFocus() {
  inputEl.current.select();
}

<input
  type="number"
  value={quantity}
  ref={inputEl}
  onChange={e => setQuantityHandler(e.target.value)}
  onFocus={handleFocus}
/>
Igor Pavlenko
la source