ReactJS con ES6: this.props no es una función cuando comunico dos componentes
ecmascript-6 (3)
Cuando usa React.createClass (), automáticamente realiza enlaces a esto para sus funciones.
Como está utilizando la sintaxis de la clase ES6, debe hacer esos enlaces usted mismo. Aquí hay dos opciones:
render() {
return <div>
<SearchBar filterUser={this.filterUser.bind(this)} />
<span>Value: {this.state.filter}</span>
</div>
}
O podría vincularlo a su constructor así:
constructor(props) {
super(props);
this.state = {name: '''', age: '''', filter: ''''};
this.filterUser = this.filterUser.bind(this);
}
Puede leer sobre esto en los documentos: https://facebook.github.io/react/docs/reusable-components.html#es6-classes
Tenga en cuenta que esas dos opciones son mutuamente excluyentes.
Estoy trabajando con ReactJS con ES6, pero tengo algunos problemas para comunicar niño> padre a través de accesorios. Ejemplo de mi enfoque:
class SearchBar extends React.Component {
handler(e){
this.props.filterUser(e.target.value);
}
render () {
return <div>
<input type=''text'' className=''from-control search-bar'' placeholder=''Search'' onChange={this.handler} />
</div>
}
}
export default class User extends React.Component {
constructor(props) {
super(props);
this.state = {name: '''', age: '''', filter: ''''};
}
filterUser(filterValue){
this.setState({
filter: filterValue
});
}
render() {
return <div>
<SearchBar filterUser={this.filterUser} />
<span>Value: {this.state.filter}</span>
</div>
}
}
Esto devuelve
Uncaught TypeError: this.props.filterUser is not a function
.
¿Alguna idea? ¿Tal vez vinculante?
[EDITAR] Solución (Gracias @knowbody y @Felipe Skinner):
Me faltaba un enlace en mi constructor. El enlace en el constructor SearchBar funciona perfectamente.
Usando
React.createClass()
(ES5), automáticamente realiza enlaces a
this
para sus funciones.
En ES6 necesita vincular
this
manualmente.
Más información
https://facebook.github.io/react/docs/reusable-components.html#es6-classes
En mi caso, estaba importando el componente de forma incorrecta. Tengo los componentes "HomeAdmin" y "Registrarse".
Tenía esto en HomeAdmin.js:
import { Register } from "/path/to/register"
Cambió a esto y funcionó:
import Register from "/path/to/register"
Falta el enlace en su constructor, tampoco necesita pasar
props
si no los está usando en el constructor.
También debe
import { PropTypes } from ''react''
class SearchBar extends React.Component {
constructor() {
super();
this.handler = this.handler.bind(this);
}
handler(e){
this.props.filterUser(e.target.value);
}
render () {
return (
<div>
<input type=''text'' className=''from-control search-bar'' placeholder=''Search'' onChange={this.handler} />
</div>
);
}
}
export default class User extends React.Component {
constructor() {
super();
this.filterUser = this.filterUser.bind(this);
this.state = { name: '''', age: '''', filter: '''' };
}
filterUser(filterValue){
this.setState({
filter: filterValue
});
}
render() {
return (
<div>
<SearchBar filterUser={this.filterUser} />
<span>Value: {this.state.filter}</span>
</div>
);
}
}