Как заставить два компонента подключаться друг к другу в React-Redux

#javascript #ruby-on-rails #reactjs #redux #react-redux

#javascript #ruby-on-rails #reactjs #redux #react-redux

Вопрос:

Я использую react / redux с проектом rails. Поэтому я хочу, чтобы мой компонент списка был претендентом (рендеринг сервера), а другой компонент просто показывал детали при наведении курсора мыши на элемент списка.

Событие наведения курсора мыши

Мой вопрос в том, как я могу получить данные о деталях компонента при наведении курсора мыши на каждый элемент списка

Простой пример

 My Code on rails view
= react_component('Listing', { data: @listings }, prerender: true )
= react_component('Detail', { }, prerender: false )

My Code on JS
export default class Listings extends Component {
  render() {
    return (
      <Provider store={store}>
        <ListingsWidget />
      </Provider>
    );
  }
}

My Code for Detail

export default class ListingDetail extends Component {
  render() {
    return (
      <Provider store={store}>
        < ListingDetail Widget />
      </Provider>
    );
  }
}
 

Ответ №1:

У вас там есть какой-то псевдокод, но у вас будет 3 компонента: Listings , ListingsItem , и ListingsItemDetail . У вас будет onMouseOver атрибут React для элемента в вашем ListingsItem , который будет вызывать ваш обработчик событий для установки состояния. Предполагая, что ваш ListingsItemDetail компонент находится внутри ListingsItem , вы проверите состояние, чтобы увидеть, нужно ли показывать ListingsItemDetail . Если ListingsItemDetail это где-то еще, то вы либо вызовете обработчик событий, переданный в качестве реквизита, либо используете Redux или что-то еще, чтобы установить идентификатор для ListingsItemDetail того, что должно отображаться.

Редактировать — добавлен частичный пример:

 const ListItem = React.createClass({
    getInitialState() {
        return {showDescription: false}
    },

    handleMouseOver() {
        this.setState({showDescription: true})
    },

    handleMouseOut() {
        this.setState({showDescription: false})
    },

    renderDescription() {
        if (this.state.showDescription) {
            return (
                <ListItemDescription description={this.props.item.description} />
            )
        }
    },

    render() {
        return (
            <div onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>
                List item title: {this.props.item.title}
                {this.renderDescription}
            </div>
        )
    }
})
 

Комментарии:

1. Можете ли вы привести краткий пример?