class ListItem extends React.PureComponent {
handleClick = () => {
const { src, label, onClick } = this.props
return onClick(src, label)
}
render() {
const { src, label, onClick } = this.props
return (
<li onClick={onClick && this.handleClick}>
<img src={src} />
<span>{label}</span>
</li>
)
}
}
<ListItem src="/uploads/0.png" label="Test" onClick={this.select} />
<First
city={data.city}
handleClick={this.handleClick(data.city)}
/>
handleClick = city => () => {
this.setState({
selectedCity: city,
});
};
class First extends React.PureComponent {
handleClick = () => {
const { onClick, city } = this.props
return onClick(city)
}
render() {
const { onClick, city } = this.props
return (
<div className="first">
<button onClick={onClick && this.handleClick}>
click
</button>
<p>{city}</p>
</div>
)
}
}
handleClick = () => {
<input onBlur={handleBlur} />
class TestComponent extends React.PureComponent{
constructor() {
super();
this.state = {
selectedCity: false,
};
}
handleClick = city => {
this.setState({
selectedCity: city,
});
};
render() {
return (
<div>
{locations.map((data, i) =>
<First
city={data.city}
onClick={this.handleClick}
/>
)}
<Second city={this.state.selectedCity} />
</div>
);
}
}
const emptyContacts = {
address: '' ,
email: '',
}
var Contact = React.createClass({
getInitialState: function() {
return {
contactData: emptyContacts,
}
},
toggleContactsData: function(event) {
this.setState({
contactData: thsi.state.contactsData === emptyContacts
? { address: this.props.address, email: this.props.email, }
: emptyContacts
});
},
render:function() {
return (
<li className="contact" onClick={this.toggleContactsData}>
<img className="contact-image" src={this.props.image} width="68px" height="68px"/>
<div className="contact-info">
<div className="contact-name" >{this.props.name}</div>
<div className="contact-number" >{this.props.phoneNumber}</div>
<div>{this.state.contactData.address}</div>
<div>{this.state.contactData.email}</div>
</div>
</li>
)
}
});
class Item extends React.PureComponent {
render() {
const { name, color } = this.props
return (
<li>
<b>{name} ({color})</b>
</li>
)
}
}
class ItemsList extends React.PureComponent {
render() {
const { items } = this.props
return (
<ul>
{items.map(item => (
<Item key={item.id} {...item} />
)}
</ul>
)
}
}
Я пометил при вызове компонента его ref'ом и пнул его setState()
как правильно отследить клик по селектору? Передавать callback и в props компонента его обрабатывать?
value={this.state.value}
addTodo() {
// ...
this.setState({todoName: ''});
}
<Route path="/" component={App}>
<Route path="list" component={ListComponent} wrapperClass="wrapper--list" />
</Route>
render() {
// routes - это массив роутов для текущей локации
// если взять за основу конфигурацию роутов, которую я привел выше,
// то при переходе по пути /list в массиве будет два элемента.
const { children, routes } = this.props
const wrapperClass = (_.findLast(routes, route => !!route.wrapperClass) || {}).wrapperClass
return (
<div className={wrapperClass}>
{children}
</div>
)
}
let newState = Object.assign(state, {messages:action._data, loading:false});
newState === state // true в вашем случае
function* myCancelableAction(someData) {
// вернет итератору промис и приостановит работу функции до следующего вызова next
// в нашем случае - функция продолжит выполнение, когда придет ответ сервера
const response = yield doAjaxRequest(someData)
yield dispatchSuccessAction(response)
}
const action = myCancelableAction();
const promise = action.next().value // fetch promise
promise.then(response => {
// если новых запросов не поступило
if(!newRequestIsComing) {
// мы можем передать значение в нашу функцию (через next)
console.log(action.next(response).value); // dispatched action
}
})
class MyClickableComponent extends React.PureComponent {
construct(props, context) {
super(props, context)
this.state = {
isOpen: false,
}
}
handleClick = e => {
this.setState({ isOpen: true })
}
render() {
const { isOpen } = this.state
return (
<div>
<div onClick={this.handleClick }>click on me</div>
{isOpen && (
<b>opened!</b>
)}
</div>
)
}
}
ReactDOM.render(
<div>
<Month />
<MyClickableComponent />
<Content />
</div>,
document.getElementById('root')
);
// Я удалил все лишнее
class DelayedContainer extends React.PureComponent {
constructor(props, context) {
super(props, context)
this.chidrenRefs = {}
this.state = {
childrenStore: this.childrenArrToStore(React.Children.toArray(props.children))
}
}
removeChidren = (key) => {
const { childrenStore } = this.state
this.chidrenRefs = _.omit(this.chidrenRefs, key)
this.setState({
childrenStore: _.omit(childrenStore, key)
})
}
handleChildRef = (node, key) => {
this.chidrenRefs[key] = node
}
render() {
const { childrenStore } = this.state
return (
<div>
{_.values(childrenStore).map(child => {
return React.cloneElement(child, { ref: node => this.handleChildRef(node, child.key) })
})}
</div>
)
}
// Компонент, который будем удалять с задержкой
// обратите внимание на метод doDefferedUnmount
// именно его мы будем вызывать
class SomeItem extends React.PureComponent {
doDefferedUnmount = () => {
console.log('doDefferedUnmount for ', this.props.word);
return new Promise(resolve => setTimeout(resolve, 200))
}
handleClick = e => {
const { id, onClick } = this.props
return onClick && onClick(id, e)
}
render() {
const { word } = this.props
return (
<button type="button" onClick={this.handleClick}>{word}</button>
)
}
}
Компонент не удалялся из DOM и с ним можно было работать, выполнять какие-то функции и только когда моя функция возвращает true он удалял его из dom
<script type="text/babel" src="foo.js"></script>
// enable runtime transpilation to use ES6/7 in node
var fs = require('fs');
var babelrc = fs.readFileSync('./.babelrc');
var config;
try {
config = JSON.parse(babelrc);
} catch (err) {
console.error('==> ERROR: Error parsing your .babelrc.');
console.error(err);
}
require('babel-register')(config);
class Avatar extends React.Component {
render() {
const finalClassName = 'avatar ' + (this.props.className || '')
return (
<img className={finalClassName} src={this.props.user.avatarUrl} alt={this.props.user.name} />
);
}
}
class UserInfo extends React.Component {
render() {
return (
<div className="user-info">
<Avatar className="user-info__avatar" user={this.props.user} />
<div className="user-info__name">{this.props.user.name}</div>
</div>
);
}
}
// выражение в скобочках нужно, чтобы не получилось 'avatar undefined', когда className не передан.
// Я рекомендую указать className, равное '', в defaultProps компонента Avatar
const finalClassName = 'avatar ' + (this.props.className || '')
const finalClassName = classnames({
'avatar': true,
[this.props.className]: !!this.props.className,
'some-other-class': someCondition
})
<Route path="/" component={App}>
<Route onEnter={checkAuth}>{/* Auth routes */}</Route>
{/* Home page route */}
<IndexRoute component={Home}>
{/* Other public routes /*}
<Route path="about" component={AboutPage} />
</Route>