watch の書き方がよくわからなくなったので整理。
オブジェクトを watch するときは cloneDeep しないと変更前の値を正しくとれないので、(refでも)getter関数を通す必要あり。
getter関数を通す場合、 ref や computed は .value まで指定する必要あり。
オブジェクトを watch するときは 第3引数で deep: true の指定は必須。
オブジェクト内の個別の値を watch するときも getter関数を通す必要あり。
import {defineComponent, ref, reactive, computed, watch} from '@nuxtjs/composition-api'
import _ from 'lodash'
export default defineComponent({
props:{
propVal:{
type:String,
default:()=>{
return ''
}
},
propObj:{
type:Object,
default:()=>{
return {}
}
}
},
setup(props){
const refVal = ref(0)
const refObj = ref({
aa:'aaa',
bb:'bbb'
})
const reactiveObj = reactive({
aa:'aaa',
bb:'bbb'
})
const computedObj = computed(()=>reactiveObj)
watch(
refVal, // ref の場合はそのまま渡す
(current,old) => {
// 処理
},
{ immediate: true } // 初回処理がいるときは immediate の指定
)
watch(
// refでもオブジェクトの場合はreactiveと同じようにcloneDeepする必要があり、ゲッター関数を使うことになるので value まで指定する必要あり
()=>_.cloneDeep(refObj.value) ,
(current,old) => {
// 処理
},
{ immediate: true, deep: true } // オブジェクトのときは deep の指定
)
watch(
()=>refObj.value.aa , // 個別の値まで指定すれば cloneDeep はなくていい
(current,old) => {
// 処理
},
{ immediate: true }
)
watch(
// computed でもオブジェクトの場合は cloneDeepする必要があり、ゲッター関数を使うことになるので value まで指定する必要あり
()=>_.cloneDeep(computedObj.value) ,
(current,old) => {
// 処理
},
{ immediate: true, deep: true } // オブジェクトのときは deep の指定
)
watch(
()=>_.cloneDeep(reactiveObj) , // deepクローンしないと変更前の値をとれない
(current,old) => {
// 処理
},
{ immediate: true, deep: true }
)
watch(
()=>reactiveObj.aa , // 個別の値まで指定すれば cloneDeep はなくていい
(current,old) => {
// 処理
},
{ immediate: true }
)
watch(
()=>props.propVal,
(current,old) => {
// 処理
},
{ immediate: true }
)
watch(
()=>_.cloneDeep(props.propObj), // deepクローンしないと変更前の値をとれない
(current,old) => {
// 処理
},
{ immediate: true, deep: true } // オブジェクトのときは deep の指定
)
return {}
}
})