Обновление (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);
},
Родитель уже знает 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 ;
}
});
В этом примере становится намного понятнее, что вы уже знаете, каковы реквизиты Ребенка.
Если это действительно касается реквизита ребенка, вы можете избежать любого подключения с помощью Ребенок вообще.
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 ;
}
});
Нет необходимости в дополнительной настройке при подключении дополнительных дочерних компонентов
var Parent = React.createClass({
getInitialState: function () {
return {
text: "Click here",
text2: "No, Click here",
};
},
onClick: function (text) {
alert(text);
},
render: function() {
return
;
}
});
Но я подозреваю, что это не ваш фактический прецедент , Итак, давайте копаем дальше ...
Общий характер представленного примера трудно обсуждать. Я создал компонент, который демонстрирует практическое применение для вышеупомянутого вопроса, реализованного в способе 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 });
}
Постарайтесь, чтобы ваши внешние компоненты были максимально непрозрачными. Стремитесь убедиться, что у них очень мало предпочтений о том, как родительский компонент может их реализовать.
Имейте в виду, кто владеет данными, которыми вы управляете. В большинстве случаев вам необходимо делегировать обработку событий по дереву компоненту, который владеет , который находится в состоянии.
Кроме того: Тип потока - хороший способ уменьшить этот тип необходимых подключений в приложениях.