|
@@ -1,82 +1,53 @@
|
|
|
<template>
|
|
|
- <h2>计算属性和监听属性</h2>
|
|
|
- <fieldset>
|
|
|
- <legend>姓名操作</legend>
|
|
|
- 姓氏: <input type="text" v-model="user.firstName" />
|
|
|
- <br />
|
|
|
- 名字: <input type="text" v-model="user.lastName" />
|
|
|
- </fieldset>
|
|
|
- <fieldset>
|
|
|
- <legend>计算属性和监听的演示</legend>
|
|
|
- 姓名: <input type="text" v-model="fullName1" /><br />
|
|
|
- 姓名: <input type="text" v-model="fullName2" /><br />
|
|
|
- 姓名: <input type="text" v-model="fullName3" />
|
|
|
- </fieldset>
|
|
|
+ <h2>toRefs</h2>
|
|
|
+ <!-- <h3>name: {{ state2.name }}</h3>
|
|
|
+ <h3>age: {{ state2.age }}</h3> -->
|
|
|
+
|
|
|
+ <h3>name: {{ name }}</h3>
|
|
|
+ <h3>age: {{ age }}</h3>
|
|
|
+
|
|
|
+ <h3>name2: {{ name2 }}</h3>
|
|
|
+ <h3>age2: {{ age2 }}</h3>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts">
|
|
|
-import { defineComponent, computed, watch, ref, reactive ,watchEffect} from "vue";
|
|
|
-
|
|
|
+import { defineComponent, reactive, toRef, toRefs } from "vue";
|
|
|
+function useFeature() {
|
|
|
+ const state = reactive({
|
|
|
+ name2: "xiaoming",
|
|
|
+ age2: 18,
|
|
|
+ });
|
|
|
+ return {
|
|
|
+ ...toRefs(state)
|
|
|
+ }
|
|
|
+}
|
|
|
export default defineComponent({
|
|
|
+ //toRefs 把一个响应式对象转化成普通对象 该普通对象的每个 property都是一个ref
|
|
|
setup() {
|
|
|
- const user = reactive({
|
|
|
- firstName: "小猪",
|
|
|
- lastName: "佩奇",
|
|
|
+ const state = reactive({
|
|
|
+ name: "xiaoming",
|
|
|
+ age: 18,
|
|
|
});
|
|
|
- //通过计算属性的方式
|
|
|
- //vue3中的计算属性
|
|
|
- const fullName1 = computed(() => {
|
|
|
- return user.firstName + "_" + user.lastName;
|
|
|
- });
|
|
|
-
|
|
|
- const fullName2 = computed({
|
|
|
- get() {
|
|
|
- return user.firstName + "_" + user.lastName;
|
|
|
- },
|
|
|
- set(val: string) {
|
|
|
- const names = val.split("_");
|
|
|
- user.firstName = names[0];
|
|
|
- user.lastName = names[1];
|
|
|
- },
|
|
|
- });
|
|
|
-
|
|
|
- const fullName3 = ref("");
|
|
|
- watch(
|
|
|
- user,
|
|
|
- ({ firstName, lastName }) => {
|
|
|
- fullName3.value = firstName + "_" + lastName;
|
|
|
- },
|
|
|
- {
|
|
|
- immediate: true,
|
|
|
- deep: true,
|
|
|
- }
|
|
|
- );
|
|
|
- //immediate 一开始执行一次 deep深度监视
|
|
|
-
|
|
|
- //监视
|
|
|
- // watchEffect(()=>{
|
|
|
- // fullName3.value = user.firstName + '_' + user.lastName
|
|
|
- // })
|
|
|
- //监视fullName3的数据 去改变firstName和lastName
|
|
|
- // watchEffect(()=>{
|
|
|
- // const names = fullName3.value.split('_')
|
|
|
- // user.firstName = names[0]
|
|
|
- // user.lastName = names[1]
|
|
|
- // })
|
|
|
- //fullName3 是响应式数据
|
|
|
- // watch([user.firstName,user.lastName,fullName3],()=>{
|
|
|
- // console.log('========')
|
|
|
- // })
|
|
|
-
|
|
|
- //如果非要监听非响应式数据的时候
|
|
|
- watch([()=>user.lastName,()=>user.firstName],()=>{
|
|
|
- console.log('!!!!')
|
|
|
- })
|
|
|
+ const state2 = toRefs(state)
|
|
|
+ console.log(state)
|
|
|
+ console.log(state2)
|
|
|
+ const { name, age } = toRefs(state);
|
|
|
+ //解决: 利用toRefs可以将一个响应式reactive 对象的所有原始属性转化为ref属性
|
|
|
+ //应用: 当从而成函数返回响应式对象时,可以在不丢失响应式的情况下对返回的对象进行分解使用
|
|
|
+ const {name2,age2} = useFeature()
|
|
|
+ setInterval(() => {
|
|
|
+ // state.name += '='
|
|
|
+ // state2.name.value += '!'
|
|
|
+ name.value += "!!!!";
|
|
|
+ name2.value += '!!!!'
|
|
|
+ }, 2000);
|
|
|
return {
|
|
|
- user,
|
|
|
- fullName1,
|
|
|
- fullName2,
|
|
|
- fullName3,
|
|
|
+ // ...state,
|
|
|
+ // state2
|
|
|
+ name,
|
|
|
+ age,
|
|
|
+ name2,
|
|
|
+ age2
|
|
|
};
|
|
|
},
|
|
|
});
|