Я отправляю из родительского компонента опору: user
. Теперь в дочернем компоненте я хочу сделать его копию без изменения значения свойства.
Я пробовал сделать это так:
export default defineComponent({
props: {
apiUser: {
required: true,
type: Object
}
},
setup(props) {
const user = ref(props.apiUser);
return { user };
}
});
Но затем, если я изменю значение объекта пользователя, это также изменит опору apiUser. Я думал, что, возможно, использование Object.assign
будет работать, но тогда ref больше не реагирует.
В Vue 2.0 я бы сделал это так:
export default {
props: {
apiUser: {
required: true,
type: Object
}
},
data() {
return {
user: {}
}
},
mounted() {
this.user = this.apiUser;
// Now I can use this.user without changing this.apiUser's value.
}
};
Кредиты @butttons за комментарий, который привел к ответу.
const user = reactive({ ...props.apiUser });
return user
должен находиться внутри функцииsetup()
. И вы можете деструктурировать входящуюapiUser
опору, назначив ееuser
, например:const user = ref(...props.apiUser);
ТеперьapiUser
иuser
- это две разные копии. - person butttons   schedule 25.08.2020ref([...props.apiUser]);
? В противном случае машинописный текст выдает ошибку, что он ожидал 1 или более аргументов, но не получил ни одного. Когда я использую его так, как написал, он генерирует такую ошибку:Type '{ [key: string]: any; }' must have a '[Symbol.iterator]()' method that returns an iterator.
- person Ezrab_   schedule 25.08.2020reactive
. Совершенно уверен, что это не вызовет ошибку типа. Попробуйте использоватьconst user = reactive(...props.apiUser);
. Вот когда использовать ref vs reactive. - person butttons   schedule 25.08.2020const user = reactive({ ...props.apiUser });
- person Ezrab_   schedule 25.08.2020