Но почему-то, при загрузке компонента Artobjects, первым из actions вызывается getArtObjects, а потом уже loadUser. Из-за этого, action getArtObjects не может получить данные о юзера из глобального стейта, тк. появляются они позже.
const store = configureStore();
store.dispatch(clientInit()); // тут
const Root = () => (
<Provider store={store}>
<Router>
<App />
</Router>
</Provider>
);
{isInitialDataFetching ? <Preloader /> : this.renderContent()}
Что в данном примере я сделал не правильно?
import React, { useState } from "react";
const initialState = [
{ id: 1, name: 'Moscow' },
{ id: 2, name: 'Kazan' },
{ id: 3, name: 'Sochi' },
{ id: 4, name: 'Ekaterinburg' },
];
const App = () => {
const [ cities, setCities ] = useState(initialState);
const handler = () => {
setCities(prevState => [...prevState, { id: 5, name: 'Saint-Petersburg' }]);
};
return (
<div>
<button onClick={handler}>Click Me</button>
<ul>
{cities.map(city => <li key={city.id}>{city.name}</li>)}
</ul>
</div>
);
};
export default App;
- SAP - это такая себе, специфическая тема (ну, как я ее вижу) - делать сайт (речь идет именно о сайтостроении) как SAP - далеко не всегда оправданно. В том числе, и исходя из стоимости разработки и поддержки.
class Menu extends Component {
state = { isActive: false };
wrapper = React.createRef();
componentWillUnmount() {
this.removeOutsideClickListener();
}
addOutsideClickListener() {
document.addEventListener('click', this.handleDocumentClick);
}
removeOutsideClickListener() {
document.removeEventListener('click', this.handleDocumentClick);
}
onShow() {
this.addOutsideClickListener();
}
onHide() {
this.removeOutsideClickListender();
}
onClickOutside() {
this.setState({ isActive: false });
}
handleDocumentClick = e => {
if (this.wrapper.current && !this.wrapper.current.contains(e.target)) {
this.onClickOutside();
}
};
toggleMenu = () => {
this.setState(
prevState => ({ isActive: !prevState.isActive }),
() => {
this.state.isActive ? this.onShow() : this.onHide();
},
);
};
render() {
const { isActive } = this.state;
return(
<div ref={this.wrapper}>
<button onClick={this.toggleMenu}>MENU</button>
{isActive && (
<ul>
<li>qwe</li>
<li>asd</li>
<li>zxc</li>
</ul>
)}
</div>
)
}
}
import ReactExport from "react-data-export";
const { ExcelFile } = ReactExport;
const { ExcelSheet } = ExcelFile;
const Grid extends React.Component {
state = { itemsSize: 'sm' };
handleChangeSize = () => { /* some code */ };
render() {
const { itemSize } = this.state;
const { items } = this.props;
return (
<Wrapper>
<ControlPanel onChangeSize={this.handleChangeSize} />
{items.map(item => <Item key={item.id} size={this.state.itemSize} />)}
</Wrapper>
);
}
}
class ExampleComponent extends React.Component {
state = {
isReady: false,
};
hanldeOnLoad = () => {
this.setState({ isReady: true });
};
render() {
const { src } = this.props;
const { isReady } = this.state;
const className = isReady ? '' : 'some-class';
return (
<div className={className}>
<img onLoad={this.hanldeOnLoad} src={src} />
</div>
);
}
}
const hiddenSyle = props => props.hidden && css`
display: none;
`;
const disabledStyle = props => props.disabled && css`
pointer-events: none;
opacity: 0.3;
`;
const Input = styled.input`
${hiddenStyle}
${disabledStyle}
`;
Какой объект принимает react-dom?
console.log('Root ReactElement: ', <MyRootСomponent />);