const MySuperTree => (props) => (
<ul>{props.nodes.map(node => <TreeNode {...node} />)}</ul>
)
class TreeNode extends PureComponent {
render() {
const { name, val1, val2, nodes } = this.props
return (
<li>
<b>{name} | {val1} | {val1+getValFromChild(childs)} {val2}</b>
{nodes && nodes.length > 0 && (
<MySuperTree nodes={nodes} />
)}
</li>
)
}
}
class Cover extends Component {
state = {
loaded: false,
width: 0,
height: 0,
}
componentDidMount() {
const img = document.createElement('img')
img.onload = e => {
console.log('image loaded', img.width, img.height)
this.setState({ loaded: true, width: img.width, height: img.height })
}
img.src = this.props.src
}
renderLoading() {
return <div>loading... </div>
}
renderLoaded() {
const { width, height } = this.state
const isFits = width === 140 && height === 205
return isFits
? <div>обложка успешно установлена</div>
: <div>Обложка должна быть 140х205</div>
}
render() {
return this.state.loaded ? this.renderLoaded() : this.renderLoading()
}
}
import('moduleName').then(module => /* do something */)
class Bundle extends Component {
state = {
// short for "module" but that's a keyword in js, so "mod"
mod: null
}
componentWillMount() {
this.load(this.props)
}
componentWillReceiveProps(nextProps) {
if (nextProps.load !== this.props.load) {
this.load(nextProps)
}
}
load(props) {
this.setState({
mod: null
})
props.load((mod) => {
this.setState({
// handle both es imports and cjs
mod: mod.default ? mod.default : mod
})
})
}
render() {
return this.state.mod ? this.props.children(this.state.mod) : null
}
}
export default Bundle
<Bundle load={() => import('./something')}>
{(mod) => ()}
</Bundle>
entry: {
application: /* ... */
},
....
plugins: {
new webpack.optimize.CommonsChunkPlugin({
name: 'application', // <--- Так же как и entryPoint
async: "vendors", // <--- будет использовано как имя файла (можно оставить просто true). "vendors.js"
children: true,
minChunks: 2 // <--- должно быть >= 2
})
}
{
entry: {
main: './reactStartup.js'
},
output: {
filename: '[name]-bundle.js',
chunkFilename: '[name]-chunk.js',
path: path.resolve(__dirname, 'dist'),
publicPath: 'dist/'
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
async: true,
children: true,
minChunks: 2,
}),
]
}
// .babelrc
{
"plugins": [
"syntax-dynamic-import"
]
}
"presets": [
[
"env",
{
"targets": {
"node": "current",
"browsers": "last 2 versions"
},
"modules": false,
"loose": true
}
],
"react",
],
fetch('http://country.io/names.json')
.then(r => r.json())
.then(names => console.log('Names arrived!', names)
<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: ''});
}
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')
);
Интересует вопрос, что лучше подойдет для этого? Знаю , что angular2 в разы превосходит react по производительности, но большинство "хейтят" ангулар и идут в сторону React
затем обращаться к компонентам react ( возможно ли обратиться извне? )
В планах создать социальную сеть.
Интересует вопрос, что лучше подойдет для этого?
return {
...state,
user: {
...state.user,
response: { ...action.payload },
}
}