function fetchProductBySlug(slug) {
return async dispatch => {
dispatch({ type: FETCH_PRODUCT_BY_SLUG });
try {
const { data } = await axios.get(`/products/${slug}`);
dispatch({ type: FETCH_PRODUCT_BY_SLUG_SUCCEEDED, payload: data });
} catch (err) {
dispatch({ type: FETCH_PRODUCT_BY_SLUG_FAILED, payload: mapAxiosError(err) });
}
};
}
export default function product(state = initialState, action) {
switch(action.type) {
case FETCH_PRODUCT_BY_SLUG:
return {
...state,
isFetching: true,
error: null,
};
case FETCH_PRODUCT_BY_SLUG_SUCCEEDED:
return {
...state,
product: action.payload,
isFetching: false,
error: null,
};
case FETCH_PRODUCT_BY_SLUG_FAILED:
return {
...state,
isFetching: false,
error: action.payload,
};
default:
return state;
}
}
Родитель выполняется 1 раз.
Если использовать PureComponent то 2 раза. Но всё равно раз лишний.
removeItem(index) {
const newItems = [...this.state.items];
newItems.splice(index, 1);
this.setState({ items: newItems });
}
removeItem(id) {
this.setState({
items: this.state.items.filter(item => item.id !== id),
});
}
<button onClick={() => this.removeItem(item.id)} class="nhc-btn">
<div key={item.id} class="note-container">
Сейчас я пишу пользовательский хук, в который при вызове передавался бы селектор ID,
Мне нужно внутри одного компонента получить значение высоты другого компонента. Как это сделать?
Но столкнулся с проблемой, что в кастомных компонентах атрибут id рассматривается как prop
npm i -S tslint tslint-config-airbnb tslint-config-prettier tslint-react prettier
{
"extends": ["tslint:recommended", "tslint-config-prettier", "tslint-config-airbnb", "tslint-react"],
/* ... */
}
Почему dispatch не срабатывает?
setProductComments(/* ... */);
this.props.setProductComments(/* ... */);
this.props.dispatch(setProductComments(/* ... */));
const mapDispatchToProps = {
setProductComments,
};
Зачем в Web-приложении может понадобиться решение вроде Redux?
class Main extends Component {
state = {
isInitializing: true,
isSignedIn: false,
user: null,
};
async componentDidMount() {
// тут достаем токен, например, из cookie
const token = storage.get(TOKEN_KEY);
if (token) {
// тут сетим токен в заголовки по-умолчанию библиотеки для HTTP-запросов
api.setHeader('Authorization', `Bearer ${token}`);
const user = await api.getUser();
this.setState({ user, isSignedIn: true, isInitializing: false });
} else {
this.setState({ isInitializing: false });
}
}
render() {
const { isSignedIn, isInitializing } = this.state;
// на время инициализации показываем ProgressBar
if (isInitializing) return <ProgressBar />;
return (
<code lang="html">
<Router>
<div id = 'content'>
{isSignedIn ? (
<React.Fragment>
<Route path='/feed' exact component={Feed} />
<Redirect from='/' to="/feed" />
</React.Fragment>
) : (
<React.Fragment>
<Route path='/' exact component={Auth} />
<Redirect from="/feed" to="/" />
</React.Fragment>
)}
</div>
</Router>
</code>
);
}
}
const store = configureStore();
store.dispatch(init()); // начинаем процесс инициализации еще до монтирования приложения
ReactDOM.render(
<Provider store={store}>
<Main />
</Provider>, document.getElementById('main'),
);
class Example extends React.Component {
ref;
render() {
return <div ref={node => this.ref = node} />;
}
}
class Example extends React.Component {
ref;
createRef = node => this.ref = node;
render() {
return <div ref={this.createRef} />;
}
}
render() {
const { report = {} } = this.props;
return (
<Fragment>
<Head>
<title>Doctor problem with {report.doctor.name}</title>
</Head>
{report && <ReportDetail showDetailButton={false} data={report} />}
</Fragment>
);
}
get renderReports() { /* ... */ }
handleChange = (e, key) => {
const value = e.target.value;
this.setState({
[key]: value,
});
};
<Input
id="outlined-name" // зачем?
placeholder="Problem Summary"
value={reportTitle}
onChange={e => handleChange(e, "reportTitle")}
/>
handleChange = e => {
const { name, value } = e.target;
this.setState({
[name]: value,
});
};
<Input
id="outlined-name" // зачем?
placeholder="Problem Summary"
name="reportTitle"
value={reportTitle}
onChange={handleChange}
/>
/components/ReportDetail/constants.js
зачем?