В документах VueJs 2.0 я не могу найти никаких хуков, которые бы слушали props
изменения.
У VueJs есть такие хуки как onPropsUpdated()
или похожие?
Обновить
Как и предложил @wostex, я попытался сделать watch
это, но ничего не изменилось. Тогда я понял, что у меня есть особый случай:
<template>
<child :my-prop="myProp"></child>
</template>
<script>
export default {
props: ['myProp']
}
</script>
Я передаю, myProp
что родительский компонент получает child
компонент. Тогда watch: {myProp: ...}
не работает.
javascript
vue.js
vuejs2
vue-component
Amio.io
источник
источник
Ответы:
Вы можете
watch
реквизиты выполнить некоторый код после изменений реквизита:источник
watch
. Благодаря вашему примеру я понял, что мой случай немного отличается. Я обновил свой вопрос.Вы пробовали это?
https://vuejs.org/v2/api/#watch
источник
Он,
в моем случае мне нужно было решение, при котором в любое время менялся бы любой реквизит, мне нужно было снова анализировать мои данные. Я устал делать отдельный наблюдатель для всех моих реквизитов, поэтому я использовал это:
Ключевым моментом, который следует взять из этого примера, является использование,
deep: true
чтобы он не только просматривал $ props, но и вложенные значения, такие как, например,props.myProp
Вы можете узнать больше об этих расширенных опциях просмотра здесь: https://vuejs.org/v2/api/#vm-watch
источник
Вы должны понимать, иерархию компонентов, которую вы имеете, и то, как вы передаете реквизит, определенно, ваш случай особенный и обычно не встречается разработчиками.
Если myProp изменяется в родительском компоненте, это будет отражено и в дочернем компоненте.
И если myProp изменяется в дочернем компоненте, это будет отражено и в компоненте внука.
Таким образом, если myProp изменяется в родительском компоненте, это будет отражено в компоненте внука. (Все идет нормально).
Поэтому вниз по иерархии вам не нужно ничего делать, реквизит будет по своей сути реактивным.
Теперь говорим о повышении в иерархии
Если myProp изменяется в компоненте grandChild, он не будет отражен в дочернем компоненте. Вы должны использовать модификатор .sync в дочернем элементе и генерировать событие из компонента grandChild.
Если myProp изменяется в дочернем компоненте, он не будет отражен в родительском компоненте. Вы должны использовать модификатор .sync в родительском и генерировать событие от дочернего компонента.
Если myProp изменяется в компоненте grandChild, он не будет отражен в родительском компоненте (очевидно). Вы должны использовать дочерний модификатор .sync и событие emit из компонента grandchild, затем наблюдать за пропуском в дочернем компоненте и генерировать событие при изменении, которое прослушивается родительским компонентом с использованием модификатора .sync.
Давайте посмотрим код, чтобы избежать путаницы
Parent.vue
Child.vue
Grandchild.vue
Но после этого вы не заметите кричащих предупреждений о том, что
Опять же, как я упоминал ранее, большинство разработчиков не сталкиваются с этой проблемой, потому что это анти паттерн. Вот почему вы получаете это предупреждение.
Но для того, чтобы решить вашу проблему (в соответствии с вашим дизайном). Я считаю, что вы должны сделать вышеупомянутую работу (взломать, если честно). Я все еще рекомендую вам пересмотреть свой дизайн и сделать его менее подверженным ошибкам.
Я надеюсь, что это помогает.
источник
Не уверен, что вы решили (и правильно ли я понял), но вот моя идея:
Если parent получает myProp, и вы хотите, чтобы он передавался child и просматривал его в child, то parent должен иметь копию myProp (не ссылку).
Попробуй это:
и в HTML:
на самом деле вы должны быть очень осторожны при работе со сложными коллекциями в таких ситуациях (несколько раз)
источник
для двухстороннего связывания вы должны использовать модификатор .sync
подробнее ...
и вы должны использовать свойство watch в дочернем компоненте, чтобы прослушивать и обновлять любые изменения
источник
Я работаю с вычисляемым свойством, таким как:
Ресурсы в этом случае являются свойством:
источник
Для меня это вежливое решение, чтобы получить одно конкретное изменение реквизитов и создать с ним логику.
Я бы использовал
props
и переменныеcomputed
свойства для создания логики после получения измененийТаким образом, мы могли бы использовать _objectDetail на визуализации html
или в некотором методе:
источник
Вы можете использовать режим просмотра, чтобы обнаружить изменения:
Делай все на атомном уровне. Поэтому сначала проверьте, вызывается ли сам метод watch или нет, утешая что-то внутри. Как только будет установлено, что часы вызывают, разбейте их своей бизнес-логикой.
источник
Я использую
props
иcomputed
свойства переменных, если мне нужно создать логику после получения измененийисточник
если myProp - объект, его нельзя изменить в обычном режиме. поэтому часы никогда не сработают. причина, по которой myProp не изменяется, заключается в том, что в большинстве случаев вы просто устанавливаете некоторые ключи myProp. Сам myProp все еще один. попробуйте посмотреть реквизиты myProp, например "myProp.a", он должен работать.
источник
Функция watch должна размещаться в дочернем компоненте. Не родитель.
источник
У @JoeSchr хороший ответ. вот еще один способ сделать это, если вы не хотите 'deep: true'.
источник