Vue3,当ref对象的属性被另一个ref对象引用时,如何保持响应式?

新手上路,请多包涵
const model = ref({
    layout: 'vertical'
})
const formOptions = ref({
    formProps: {
        layout: model.value.layout
    }
})

我需要在执行modal.value.layout = 'inline'
使得formOptions.value.formProps.layout同步修改,
但是在以上↑↑↑↑↑↑↑所示的代码中无法实现
目前的方案只得按如下↓↓↓↓↓所示代码实现

const layout = ref('vertical')
const model = ref({
    layout
})
const formOptions = ref({
    formProps: {
        layout
    }
})
// 此时执行layout.value = 'inline',可以同步修改model和formOptions中的layout属性

我的问题是:有没有更好的实现方案,在不单独定义一个layout属性的情况下实现我的需求?

阅读 2.4k
4 个回答
import { ref, computed } from 'vue';

const model = ref({
  layout: 'vertical'
});

const formOptions = ref({
  formProps: {
    layout: computed(() => model.value.layout)
  }
});


model.value.layout = 'inline';

可以考虑结合 reactive 和 toRef(或 toRefs)使用

const m = reactive({
  layout: 'vertical',
})

const f = ref({
  formProps: {
    layout: toRef(m, 'layout'),
  },
})

toref

新手上路,请多包涵

利用属性访问器 get set

const model = ref({
    layout: 'vertical'
})
const formOptions = ref({
    formProps: {
        get layout () {
            return model.value.layout
        }
    }
})
const model = ref({
    layout: 'vertical'
})
const obj = reactive({
    formProps: model
});

测试代码:

setTimeout(()=> {
    model.value.layout = 'inline';
}, 2000);
watch([obj, model], ()=> {
    console.log("obj改变了", obj.formProps.layout);
    console.log("model改变了", model.value.layout);
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏