const freezedObject = Object.freeze({ a: 1, b: 5 })
freezedObject.a = 'quux'; // тихо ничего не делает
Значит ли это, что адаптивная вёрстка неприменима для приложений и придётся делать различные представления на разные устройства
Следовательно, обработчики тоже разные: в одном случае это переход на новый экран, в другом - открытие модального окна.
Или всё же можно грамотно строить адаптивные приложения?
Желательно использовать при этом динамическую загрузку модулей?
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>
)
}
}
const toastrOptions = {
timeOut: 3000, // by setting to 0 it will prevent the auto close
// ...
}
// что-то вроде этого
promises.push(
store
.dispatch(route.loadData())
.then(() => store.dispatch(dataForRouteLoaded(req.url))
)
Когда компонент маунтится
export default function reducer(state=initialState, action) {
switch (action.type) {
case 'INCRE_TEST':
return state.int + action.int
default:
return state
}
}
И тут самое непонятное, как все это правильно собирать?
Не понимаю как подключить функцию к onClick
const mapDispatchToProps = dispatch => {
return {
onClick: int => {
dispatch(increTest(int))
}
}
}
const mapDispatchToProps = dispatch => {
return {
onClick: () => {
dispatch(increTest(1))
}
}
}
<button onClick={() => this.props.onClick(1)}>Click onClick</button>
function removeSomething(id) {
return { type: 'RemoveSomething_Action', payload: { id } }
}
function reducer(state = initialState, action) {
switch(action.type) {
//...
case 'RemoveSomething_Action':
return state.filter(el => el.id !== action.payload.id)
// ...
}
}
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",
],