Что эквивалентно функции angular $ watch в React.js?
Я хочу прослушивать изменения состояния и вызывать такую функцию, как getSearchResults ().
componentDidMount: function() {
this.getSearchResults();
}
Что эквивалентно функции angular $ watch в React.js?
Я хочу прослушивать изменения состояния и вызывать такую функцию, как getSearchResults ().
componentDidMount: function() {
this.getSearchResults();
}
Ответы:
Я не использовал Angular, но, читая ссылку выше, кажется, что вы пытаетесь кодировать что-то, что вам не нужно обрабатывать. Вы вносите изменения в состояние в иерархии компонентов React (через this.setState ()), и React заставляет ваш компонент повторно визуализироваться (фактически «прослушивая» изменения). Если вы хотите «слушать» другой компонент в вашей иерархии, у вас есть два варианта:
Следующие методы жизненного цикла будут вызываться при изменении состояния. Вы можете использовать предоставленные аргументы и текущее состояние, чтобы определить, изменилось ли что-то значимое.
componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
componentDidUpdate
компонента с опорой было правильным рецептом. Спасибо за это.
componentWillUpdate
устарел: reactjs.org/blog/2018/03/27/update-on-async-rendering.html
componentDidUpdate
не будет также срабатывать при получении новых свойств, не обязательно только при изменении состояния?
componentWillUpdate
не рекомендуется.
Я думаю, вам следует использовать ниже Жизненный цикл компонента, как если бы у вас есть свойство ввода, которое при обновлении должно запускать обновление вашего компонента, тогда это лучшее место для этого, поскольку оно будет вызываться перед рендерингом, вы даже можете обновить состояние компонента, чтобы оно было отражается на представлении.
componentWillReceiveProps: function(nextProps) {
this.setState({
likesIncreasing: nextProps.likeCount > this.props.likeCount
});
}
Начиная с React 16.8 в 2019 году с хуками useState и useEffect , следующее теперь эквивалентно (в простых случаях):
AngularJS:
$scope.name = 'misko'
$scope.$watch('name', getSearchResults)
<input ng-model="name" />
Реагировать:
const [name, setName] = useState('misko')
useEffect(getSearchResults, [name])
<input value={name} onChange={e => setName(e.target.value)} />
Использование useState с useEffect, как описано выше, является абсолютно правильным способом. Но если функция getSearchResults возвращает подписку, то useEffect должен вернуть функцию, которая будет отвечать за отказ от подписки. Функция, возвращенная из useEffect, будет запускаться перед каждым изменением зависимости (имя в приведенном выше случае) и при уничтожении компонента.
Это было давно, но на будущее: можно использовать метод shouldComponentUpdate ().
Обновление может быть вызвано изменениями свойств или состояния. Эти методы вызываются в следующем порядке при повторной визуализации компонента:
static getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
shouldComponentUpdate
поэтому оно может не подходить для этого варианта использования.
В 2020 году вы можете прослушивать изменения состояния с помощью хука useEffect следующим образом
export function MyComponent(props) {
const [myState, setMystate] = useState('initialState')
useEffect(() => {
console.log(myState, '- Has changed')
},[myState]) // <-- here put the parameter to listen
}