interface Filter {
name?: string;
title?: string;
}
interface FiltersProps {
filters: Filter[];
}
const Filters: React.FC<FiltersProps> = ({ filters }) => (
<div>
{filters.map((filter: Filter) => (
<div key={filter.name}>
{filter.title}
{filter.name}
</div>
))}
</div>
);
const Main: React.FC = () => (
<Filters filters={filters} />
);
interface State {
shouldShowBtn: boolean;
}
class MyComponent extends React.Component<null, State> {
state = {
shouldShowBtn: true,
};
componentDidMount() {
window.addEventListener('scroll', this.scrollHandler);
}
scrollHandler = () => {
const { shouldShowBtn } = this.state;
if (window.pageYOffset > 50 && shouldShowBtn) {
this.setState({ shouldShowBtn: false });
} else if (window.pageYOffset <= 50 && !shouldShowBtn) {
this.setState({ shouldShowBtn: true });
}
};
componentWillUnmount() {
window.removeEventListener('scroll', this.scrollHandler);
}
render() {
return (
<>
{this.state.shouldShowBtn && <button>lioih </button>}
</>
);
}
}
const MyComponent: React.FC = () => {
const [shouldShowBtn, setShouldShowBtn] = useState(true);
const context = useMemo(() => ({ shouldShowBtn }), []);
useEffect(() => {
context.shouldShowBtn = shouldShowBtn;
}, [shouldShowBtn]);
useEffect(() => {
const scrollHandler = () => {
if (window.pageYOffset > 50 && context.shouldShowBtn) {
setShouldShowBtn(false);
} else if (window.pageYOffset <= 50 && !context.shouldShowBtn) {
setShouldShowBtn(true);
}
};
window.addEventListener('scroll', scrollHandler);
return () => {
window.removeEventListener('scroll', scrollHandler);
};
}, []);
return (
<>
{shouldShowBtn && <button>lioih </button>}
</>
);
};
const useGetState = (initialState: any) => {
const [state, _setState] = useState(initialState);
const context = useMemo(() => ({ state }), []);
const getState: any = useCallback(() => context.state, []);
const setState = useCallback((state) => {
context.state = state;
_setState(state);
}, []);
return [getState, setState];
};
const MyComponent: React.FC = () => {
const [getShouldShowBtn, setShouldShowBtn] = useGetState(true);
useEffect(() => {
const scrollHandler = () => {
console.log(window.pageYOffset, getShouldShowBtn());
if (window.pageYOffset > 50 && getShouldShowBtn()) {
setShouldShowBtn(false);
} else if (window.pageYOffset <= 50 && !getShouldShowBtn()) {
setShouldShowBtn(true);
}
}
window.addEventListener("scroll", scrollHandler);
return () => {
window.removeEventListener("scroll", scrollHandler);
};
}, []);
return <div>{getShouldShowBtn() && <button>lioih </button>}</div>;
};
onMarkClick = (e) => {
e.stopPropagation();
this.setState({
important: true,
});
};
return (
<span>
<span
className={classNames}
onClick={this.onLabelClick}
>
{label}
</span>
<button type="button" onClick= {this.onMarkClick}>
<i className="fa fa-exclamation"/>
</button>
</span>
);
.todo-list-item.done {
text-decoration : line-through;
}
Что бы Вы изменили в коде?
const uid = () => Math.random().toString(36).slice(2);
class App extends React.Component {
state = {
tasks: [
{
id: uid(),
title: 'title',
description: 'description',
}
]
};
handleCreateTaskClick = () => {
this.setState(state => ({
tasks: [
...state.tasks,
{
id: uid(),
title: 'title',
description: 'description',
},
],
}));
};
render() {
const { tasks } = this.state;
return (
<div>
<button onClick={this.handleCreateTaskClick}>Добавить задачу</button>
<ul>
{tasks.map(task => (
<li key={task.id}>
id: {task.id} | {task.title} | {task.description}
</li>
))}
</ul>
</div>
);
}
}
'header'
вы присвоите вместо объекта null.var header = document.getElementById('header');
console.log(header); // null
true, потому что null относиться к объектам!
Получается, что null == undefined / true, но null === undefined/false?WTF JS?)
const str = `
<script>
console.log(1)
</script>
<script>
console.log(1)
</script>
`;
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.text = str.replace(/<[^>]*>?/gm, '');
head.appendChild(script);
yarn add react-redux
устанавливает стабильную, рекомендованную к использованию версию пакета.'Access-Control-Allow-Origin': '*' // * или ваш домен
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE'
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
import React, { useContext } from 'react';
test: /\.(js|jsx)$/,
exclude: /node_modules\/(?!(trouble-package-name|other-thouble-package-name)\/).*/,
import React from 'react';
import { render } from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root'),
);
import React from 'react';
import { render } from 'react-dom';
import { Router } from 'react-router';
import { createBrowserHistory } from 'history';
import App from './App';
const history = createBrowserHistory();
render(
<Router history={history}>
<App />
</Router>,
document.getElementById('root'),
);