Изменение отображаемого значения реакции-выбора нажатием на внешний компонент в React

Из одного массива он отображается в виде списка в одном компоненте (Box.js) и сохраняется в реакции-выборе в другом компоненте (Search.js). Оба они являются дочерними элементами одного уровня, принадлежащими родительскому компоненту (trial.js).

В конечном счете, я хочу отобразить объект либо щелкнув из списка, либо изменив/выбрав из реакции-выбора. Я поднял обработчики событий до их родителей и смог независимо отобразить выбранный объект.

Однако я не могу синхронизировать onClick с onChange. В частности, я хочу, чтобы обработчик события щелчка выделял выбранный список жирным шрифтом и изменял отображаемый элемент в реагирующем ремешке и наоборот. Пример состояния подъема и синхронизации обработчика событий, приведенный на домашней странице реакции, использует ввод текста, что на самом деле не помогает с тем, что я пытаюсь сделать.

Родитель) Trial.js:

import React, { Component } from 'react';
import { colourOptions } from './data';
import { Grid, Row } from 'react-flexbox-grid';
import Box from './box';
import Remote from './remote';

    class Trial extends Component{
        constructor(props) {
            super(props);
            this.state = {
                selected:'',
            }
        }

        getValue(e){
            this.setState({
                selected: e
            })
        }


          render() {
              return ( 
                <Grid fluid className="full-height">
                    <Row className="full-height">

                    <Box 
                        colourOptions={colourOptions}
                        handleChange={this.getValue.bind(this)}
                    />

                    <Remote 
                        colourOptions={colourOptions}
                        selected={this.state.selected}
                        handleChange={this.getValue.bind(this)}
                    />
                    </Row>
                </Grid>
          ) 
        }
    }

    export default Trial;

Ребенок со списком) Box.js:

import React, { Component } from 'react';
import { Col } from 'react-flexbox-grid';

class Box extends Component{
    constructor(props) {
        super(props);
        this.state = {
        }
    }

    clicked(e){
        this.props.handleChange(e)
    }

    render() {

          return ( 
                <Col md={9} className="col2">
                    <ul>
                        {this.props.colourOptions.map((r,i) => 
                            <li key={i} onClick={()=>this.clicked(r)}> {r.label} </li>
                            )}
                    </ul>
                </Col>


      ) 
    }
}

export default Box;

дочерний элемент с реакцией-выбором) remote.js:

import React, { Component } from 'react';
import Select from 'react-select';
import { Col } from 'react-flexbox-grid';
import RenderComp from './rendercomp';

class Remote extends Component{
    constructor(props) {
        super(props);
        this.state = {
        }
    }

    clicked(e){
        this.props.handleChange(e)
    }

      render() {
          return ( 

        <Col md={3} className="col1">

            <Select
                options={this.props.colourOptions}
                onChange={this.clicked.bind(this)}
            />                
            <RenderComp
                selected={this.props.selected}
            />
        </Col>


      ) 
    }
}

export default Remote;

дочерний элемент remote.js для отображения выбранного объекта:

import React, { Component } from 'react';

class Remote extends Component{
    constructor(props) {
        super(props);
        this.state = {
        }
    }

    renderComp(selected){
        return(
            <ul>
                <li>
                {selected.label}
                </li>
                <li>
                {selected.color}
                </li>
            </ul>            
        )
    }

    render() {
        if(this.props.selected){
            return (
                <div>
                    {this.renderComp(this.props.selected)}
                </div>
                );
        }else{
            return(
                <div></div>
            )
        } 
    }
}

export default Remote;

person episodewon    schedule 06.09.2018    source источник


Ответы (1)


Я думаю, что в вашем коде есть одна проблема:

из документации по реакции на выбор, когда вы обрабатываете обработчик события onChange, вы получите из него выбранную опцию в виде пары {value: '', label: ''}, которую вы передали компоненту через массив параметров , поэтому, если ваш массив параметров выглядит следующим образом: [{value: 'sth', label:'label'}], когда событие onChange запускается и выбирается один из параметров, обработчик события onChange кэширует {value: 'sth ', label:'label'} объект из массива, и если вы хотите передать данные родителю, вы должны написать onChange={data => this.props.handleChange(data.value) } таким образом, ваше значение является реальным объектом, который имеет такую ​​​​информацию, как цвет, но вы просто передаете необработанный объект, который обрабатывается как -> selected.color в вашем коде, в то время как выбранный объект является {value: {}, label: ''}, потому что вы передали только объект e и вместо этого должны передаваться как e.value, чтобы он содержал информацию о цвете.

person Mehrnaz.sa    schedule 06.09.2018