Разница между reverse () и reverse_lazy () в Django

Обновление (9/1/15): ОП задал этот вопрос немного движущейся мишенью. Он был обновлен снова. Итак, я чувствую ответственность за обновление своего ответа.

Во-первых, ответ на ваш предоставленный пример:

Да, это возможно.

Вы можете решить эту проблему, обновив Child onClick как this.props.onClick.bind(null, this):

var Child = React.createClass({
  render: function () {
    return Click me;
  }
});

Обработчик событий в вашем родителе может затем получить доступ к компоненту и событию следующим образом:

  onClick: function (component, event) {
    // console.log(component, event);
  },

Снимок JSBin

Но сам вопрос вводит в заблуждение

Родитель уже знает Child props.

Это не ясно в приведенном примере, потому что на самом деле никаких реквизитов не предоставляется. Этот примерный код может лучше поддерживать задаваемый вопрос:

var Child = React.createClass({
  render: function () {
    return  {this.props.text} ;
  }
});

var Parent = React.createClass({
  getInitialState: function () {
    return { text: "Click here" };
  },
  onClick: function (event) {
    // event.component.props ?why is this not available? 
  },
  render: function() {
    return ;
  }
});

В этом примере становится намного понятнее, что вы уже знаете, каковы реквизиты Ребенка.

JSBin snapshot

Если это действительно касается реквизита ребенка ...

Если это действительно касается реквизита ребенка, вы можете избежать любого подключения с помощью Ребенок вообще.

JSX имеет атрибуты распространения] , которые я часто использую на таких компонентах, как Child. Он принимает все props и применяет их к компоненту. Ребенок будет выглядеть так:

var Child = React.createClass({
  render: function () {
    return  {this.props.text} ;
  }
});

Позволяет использовать значения непосредственно в родительском объекте:

var Parent = React.createClass({
  getInitialState: function () {
    return { text: "Click here" };
  },
  onClick: function (text) {
    alert(text);
  },
  render: function() {
    return ;
  }
});

Снимок JSBin

Нет необходимости в дополнительной настройке при подключении дополнительных дочерних компонентов

var Parent = React.createClass({
  getInitialState: function () {
    return {
      text: "Click here",
      text2: "No, Click here",
    };
  },
  onClick: function (text) {
    alert(text);
  },
  render: function() {
    return 
; } });

JSBin snapshot

Но я подозреваю, что это не ваш фактический прецедент , Итак, давайте копаем дальше ...

Надежный практический пример

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

Рабочий пример DTServiceCalculator DTServiceCalculator repo

Этот компонент является простым калькулятором обслуживания. Вы предоставляете ему список услуг (с именами и ценами), и он рассчитает общее количество выбранных цен.

Дети блаженны не знают

ServiceItem является дочерним компонентом в этом примере. У него мало мнений о внешнем мире. Это требует нескольких реквизитов , одна из которых является функцией, которая будет вызываться при нажатии.

Он ничего не делает, кроме как позвонить предоставленному handleClick с предоставленным index [ источником ].

Родители - Дети

DTServicesCalculator - это parent-component - это пример. Это тоже ребенок. Давайте посмотрим.

DTServiceCalculator создает список дочерних компонентов (ServiceItem s) и предоставляет им реквизит [ source ]. Это родительский компонент ServiceItem, но это дочерний компонент компонента, передающий ему список. Он не владеет данными. Поэтому он снова делегирует обработку компонента его исходному компоненту source

handleServiceItem захватывает индекс, переданный от дочернего элемента, и предоставляет его своему родительскому источнику [ ]

handleServiceClick (index) {
  this.props.onSelect(index);
}

Владельцы знают все

Концепция «Собственность» является важной в Реактировании. Я рекомендую прочитать больше об этом здесь .

В примере, который я показал, я продолжаю делегировать обработку события до дерева компонентов до тех пор, пока мы не перейдем к компоненту, которому принадлежит состояние.

Когда мы, наконец, доберемся туда, мы обрабатываем выбор / отключение состояния следующим образом [ source ]:

handleSelect (index) {
  let services = […this.state.services];
  services[index].chosen = (services[index].chosen) ? false : true;
  this.setState({ services: services });
}

Заключение

Постарайтесь, чтобы ваши внешние компоненты были максимально непрозрачными. Стремитесь убедиться, что у них очень мало предпочтений о том, как родительский компонент может их реализовать.

Имейте в виду, кто владеет данными, которыми вы управляете. В большинстве случаев вам необходимо делегировать обработку событий по дереву компоненту, который владеет , который находится в состоянии.

Кроме того: Тип потока - хороший способ уменьшить этот тип необходимых подключений в приложениях.

10
задан RyuCoder 7 February 2018 в 17:08
поделиться