vue 中 watch 的詳細用法
一個物件,鍵是需要觀察的表示式,值是對應回撥函式。值也可以是方法名,或者包含選項的物件。Vue 例項將會在例項化時呼叫 $watch(),遍歷 watch 物件的每一個屬性。
API
簡單的用法
<script> export default { data() { return { cityName: 'shanghai' } }, watch: { cityName(newName, oldName) { // ... } } } </script>
或者
<script> export default { data() { return { cityName: 'shanghai' } }, watch: { cityName: 'nameChange' }, methods: { nameChange(newName, oldName) { // ... } } } </script>
immediate 和 handler
這樣使用watch時有一個特點,就是當值第一次繫結的時候,不會執行監聽函式,只有值發生改變才會執行。如果我們需要在最初繫結值的時候也執行函式,則就需要用到immediate屬性。
比如當父元件向子元件動態傳值時,子元件props首次獲取到父元件傳來的預設值時,也需要執行函式,此時就需要將immediate設為true。
<script> export default { data() { return { cityName: 'shanghai' } }, watch: { cityName(newName, oldName) { // ... }, immediate: true } } </script>
監聽的資料後面寫成物件形式,包含 handler 方法和 immediate,之前我們寫的函式其實就是在寫這個 handler 方法;
immediate 表示在 watch 中首次繫結的時候,是否執行 handler,值為true
則表示在 watch 中宣告的時候,就立即執行 handler 方法,值為 false,則和一般使用 watch 一樣,在資料發生變化的時候才執行 handler。
deep
當需要監聽一個物件的改變時,普通的watch方法無法監聽到物件內部屬性的改變,只有data中的資料才能夠監聽到變化,此時就需要deep屬性對物件進行深度監聽。
<script> export default { data() { return { cityName: { id: 1, name: 'shanghai' } } }, watch: { cityName: { handler(newName, oldName) { // ... }, deep: true, immediate: true } } } </script>
設定 deep: true 則可以監聽到 cityName.name 的變化,此時會給 cityName 的所有屬性都加上這個監聽器,當物件屬性較多時,每個屬性值的變化都會執行 handler。如果只需要監聽物件中的一個屬性值,則可以做以下優化:使用字串的形式監聽物件屬性:
<script> export default { data() { return { cityName: { id: 1, name: 'shanghai' } } }, watch: { 'cityName.name': { handler(newName, oldName) { // ... }, deep: true, immediate: true } } } </script>