import React, { Component, cloneElement } from 'react';
export default class Parent extends Component {
render() {
const { data, children } = this.props;
const childrensArray = React.Children.toArray(children);
return (
<div>
{childrensArray.map((children) => cloneElement(children, { data }))}
</div>
);
}
}
case 'TOGGLE_COMPLETED':
return Object.assign({}, state, {
todo: state.todo.map((item) => {
if(item.id == action.id) {
item.completed = !item.completed
}
return item;
})
})
method(function() {
...
});
// заменить на
method(() => {
...
})
const that = this;
that.context;
require('bootstrap-loader');
require('font-awesome-loader');
module {
loaders: [
{
test: /\.woff(.*)$/,
loader: 'url',
query: {
limit: 10000,
mimetype: 'application/font-woff',
name: 'fonts/[name].[ext]' // путь output, куда будут скопированы файлы
}
},
{
test: /\.woff2(.*)$/,
loader: 'url',
query: {
limit: 10000,
mimetype: 'application/font-woff',
name: 'fonts/[name].[ext]'
}
},
{
test: /\.ttf(.*)$/,
loader: 'url',
query: {
limit: 10000,
mimetype: 'application/octet-stream',
name: 'fonts/[name].[ext]'
}
},
{
test: /\.eot(.*)$/,
loader: 'file',
query: {
limit: 10000,
name: 'fonts/[name].[ext]'
}
},
{
test: /\.svg(.*)$/,
loader: 'url',
query: {
limit: 10000,
mimetype: 'image/svg+xml',
name: 'fonts/[name].[ext]'
}
}
]
}
var extractTextPlugin = require('extract-text-webpack-plugin');
// ...
module.exports = {
// ...
module: {
loaders: [
{
test: /\.scss$/, // для scss
loader: extractTextPlugin.extract('style', 'css!sass')
}
]
},
plugins: [
new extractTextPlugin('bundle.css') // вынести css в файл bundle.css в папку output
]
}
// ...
// SampleComponent - ваш однотипный компонент
// ...
class Test extends Component {
constructor(props) {
super(props)
this.addChild = this.addChild.bind(this)
this.state = {
components: [
{
id:1, name: 'Some Name'
}
]
}
}
addChild() {
// Изменение стейта спровоцирует перерисовку
this.setState(this.state.concat([
{id:2,name:"Another Name"}
]))
}
render() {
return (
<div>
<h1>App main component! </h1>
<button onClick={this.addChild}>Add component</button>
{ // здесь будет отрисовано необходимое кол-во компонентов
this.state.components.map((item) => (
<SampleComponent key={item.id} name={item.name}/>
))
}
</div>
);
}
}
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')
);
<span class="addField add">
<i class="icon"></i>Добавить
</span>
<div class="inputs">
<div>
<input type="file" name="dynamic[]" class="field" >
<span class="remove">Удалить</span>
</div>
</div>
$(document).ready(function () {
$('html').on('click','.add',function () {
$('<div><input type="file" class="field" name="dynamic[]" /><span class="remove">Удалить</span></div> ').fadeIn('slow').appendTo('.inputs');
});
$('html').on('click','.remove', function () {
$(this).parent().remove();
});
});