Ошибка передачи функции onClick в реакции

У меня есть два файла. Компонент списка и компонент отдельного элемента. В моем приложении пользователь может выбрать несколько элементов. Затем я создаю элемент состояния в «списке» «элементы», и моя идея состоит в том, что, когда пользователь нажимает кнопку элемента, элемент списка уведомляет Компонент списка и сохраняет элемент в массиве элементов из «списка».

У меня есть следующий код

List.jsx:

registrarItems(data,item){
        console.log(data,"aqui 1 con",item);
        let items = this.state.itemsAgregados.slice();
        if(!items.indexOf(data.id_producto)){
            console.log("no se encuentra");
            items.push(id);
            this.setState({
                'itemsAgregados':items
            });

        }else{
            console.log("ya existe");
            item.removerSeleccion();
        }
        console.log("registrando items",id);
    }
 render() {
        return (
            <div className="content-app">
                <Navbar data={this.menu}/>
                <div className="container lista-productos">
                    {
                        this.state.productos.map((producto, index) => {
                            return (
                                <Item data={producto}
                                      registro = {this.registrarItems}
                                      key={producto.id_producto}/>
                            );
                        })
                    }
                </div>
            </div>
        );
    }

И Item.jsx:

 render() {

        let props = this.props;
        let img = JSON.parse(props.data.imagen);
        let imgPath = Rutas.apiStatic + 'img/productos/' + props.data.id_producto + '/' + img.sm;
        props.data.items  = this;

        return (
            <div className="row item-listado">
                <div className="col-xs-3">
                    <img src={imgPath} className="img-circle img-item"/>
                </div>
                <div className="col-xs-7">
                    <Link to={Rutas.producto + props.data.identificador}>
                        <h3 className="titulo">{props.data.titulo}</h3>
                        <span className="price">$ {props.data.precio}</span>
                    </Link>
                </div>
                <div className="col-xs-2 text-right">
                    <ul className="list-unstyled list-acciones">
                        <li>
                            <a href="#" onClick={()=>props.registro(props.data,this)} className={this.state.classAdd}>
                                <i className="fa fa-plus"></i>
                            </a>
                        </li>

                    </ul>
                </div>
            </div>
        )
    }

Как видите, я передаю метод registrarItems в качестве параметра Item и добавляю его как событие onClick в тег из элемента. Но мне нужно передать «данные» и собственный элемент «item» в функцию onclick. Первый - для сохранения выбранного элемента в массиве Items или его удаления (если он уже существует), потому что кнопка может иметь функцию переключения. Но в моем "console.log" оба параметра, переданные методу onClick со стрелкой, отображаются как "undefined". Я видел несколько примеров и не получаю своей ошибки. Кто-нибудь может мне помочь? Благодарю.


person jrodriguez    schedule 28.01.2017    source источник
comment
попробуйте привязать registrarItems к классу List внутри constructor или определить registarItems как свойство класса (при условии, что вы stage-2 пресетов) с помощью функции стрелки.   -  person yadhu    schedule 28.01.2017
comment
Дело в том, что если я поставлю этот метод как свойство, я потеряю доступ к классу PArent. Я попробовал, и я создаю его как метод обратного вызова.   -  person jrodriguez    schedule 29.01.2017


Ответы (1)


Окончательное решение было простым. Я решил это с помощью чего-то похожего, как Свободная душа сказал в своем комментарии.

Сначала я передал компонент List как параметр item. Ниже моего кода в методе рендеринга списка:

{
        this.state.productos.map((producto, index) => {
            this.items[producto.id_producto] = producto;
            return (
                <Item data={producto}

                      parent = {this}
                      key={producto.id_producto}/>
            );
        })
    }

Затем я получаю родительский параметр в методе componentDidMount, а затем вызываю функцию validarItem непосредственно из метода List и передаю нужные мне параметры. Вот мой код товара:

onClickPlus(id,data) {

        //{Rutas.listas + 'productos/' + props.data.id_producto //Url para pasar uno solo
        this.setState({
            classAdd:'selected'
        })
        if(!this.state.parent.validarItem(this.state.data)){
            this.removerSeleccion()
        }
        if(this.state.seleccionMultiple){

        }
    }
    removerSeleccion(){

        this.setState({classAdd:'normal'})
    }
    componentDidMount(){
        this.setState({
            parent: this.props.parent,
            data : this.props.data
        })
    }

    render() {

        return (
            // more code
                <a href="#" onClick={() => this.onClickPlus(parent)} className={this.state.classAdd}>
                    <i className="fa fa-plus"></i>
                </a>
            //more render code...
        )
    }

Не знаю, лучше ли это, но у меня работает.

person jrodriguez    schedule 01.02.2017