Rumah >hujung hadapan web >View.js >[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

青灯夜游
青灯夜游ke hadapan
2022-08-30 20:20:513087semak imbas

Artikel ini meringkaskan dan berkongsi nota kajian Vue3, dan memberikan pemahaman yang mendalam tentang 11 mata pengetahuan tentang Vue3. Saya harap ia akan membantu semua orang.

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

Kursus Pembangunan Praktikal Kejuruteraan Projek Vue3 Node Webpack API Mall!

1 Mengapa memilih CompositionAPI

Penghadan Vue2

  • Kebolehbacaan yang lemah disebabkan oleh pengembangan logik komponen
  • Tidak dapat menggunakan semula kod merentas komponen
  • Vue2 mempunyai sokongan terhad untuk TS

Dalam OptionsAPI tradisional kita perlu menyebarkan logik ke dalam enam bahagian berikut. [Pengesyoran berkaitan: tutorial video vue.js]

OptionsAPI

  • components
  • Cara menggunakan props
  • data
  • computed
  • methods
  • lifecycle methods
  • CompositionAPI menyelesaikan masalah

Penyelesaian terbaik ialah mengagregatkan logik untuk menjadikan kod lebih mudah dibaca.

Inilah yang boleh dicapai oleh sintaks CompositionAPI kami. CompositionAPI ialah sintaks pilihan sepenuhnya dan tidak mempunyai konflik dengan OptionAPI asal. Ia membolehkan kami menyusun kod dengan fungsi yang sama bersama-sama tanpa menyebarkannya ke setiap sudut API pilihan

Kaedah guna semula kod PK

Kod guna semula merentas komponen dalam Vue2, we There mungkin terdapat empat pilihan

1 Mixin - Mixin

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

Pencampuran kod sebenarnya adalah mod pencampuran dalam mod reka bentuk, dan kekurangannya juga sangat banyak. jelas.
  • boleh difahamkan sebagai pewarisan berganda-ganda secara ringkas, begitulah cara seseorang mempunyai dua bapa
Keburukan

Tidak dapat dielakkan. Konflik nama atribut
  • Hubungan warisan yang tidak jelas
  • 2 Kilang Mixin - Kilang pencampuran

mengembalikan

✅Penggunaan semula kod adalah mudah[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

✅Pembersihan hubungan warisan

3 ScopeSlots - slot skop

❌Tidak boleh dibaca

❌Kompleks Konfigurasi - perlu. dikonfigurasikan dalam templat

❌ Prestasi rendah - setiap slot adalah bersamaan dengan contoh

4. CompositionApi - API komposit

✅ Sebilangan kecil kod [Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

✅ Tiada sintaks baharu diperkenalkan, hanya fungsi ringkas

✅ Sangat fleksibel

✅ Gesaan sintaks alat mesra - kerana ia adalah fungsi mudah, sangat Mudah untuk melaksanakan gesaan sintaks dan pampasan automatik

2 persediaan & rujukanSebab menggunakan CompositionAPI

.

✅ Sokongan TypeScript yang lebih baik

✅ Dalam komponen fungsi yang kompleks, kod boleh disusun mengikut ciri - kohesi kod, seperti:

Isih dan cari kohesi logik

✅ Penggunaan semula Kod Komponen antara

Apakah persediaan dilaksanakan sebelum kaedah berikut:

    Komponen?
    • Props
    • Data
    • Kaedah
    • Sifat Berkomputer
    • Kaedah kitaran hayat
    • boleh tidak lagi sukar untuk digunakan Fahami ini
  • mempunyai dua parameter pilihan
  • props - sifat (objek reaktif dan boleh dipantau (menonton))
import {watch} from "vue"
export defalut {
	props: {
		name: String
	},
	setup(props) {
		watch(() => {
			console.log(props.name)
		})
	}
}
objek konteks konteks - digunakan untuk menggantikan sifat yang boleh diakses oleh kaedah ini sebelumnya
setup (props,context) {
	const {attrs,slots,parent,root,emit} = context
}

Apakah refMeninjukan data jenis data asas menjadikannya objek responsif yang boleh menjejaki perubahan data.

Ringkasan

Kebolehselenggaraan dipertingkatkan dengan ketara[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

  • 可以控制哪些变量暴露
  • 可以跟中哪些属性被定义 (属性继承与引用透明)

三、Methods

基础用法

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

自动拆装箱总结

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

  • JS :需要通过.value访问包装对象
  • 模板: 自动拆箱

四、 Computed - 计算属性

这个地方实在没什么好讲的,和Vue2没变化

<template>
  <div>
    <div>Capacity: {{ capacity }}</div>
    <p>Spases Left: {{ sapcesLeft }} out of {{ capacity }}</p>
    <button @click="increaseCapacity()">Increase Capacity</button>
  </div>
</template>

<script>

import { ref, computed, watch } from "vue";
export default {
  setup(props, context) {
    const capacity = ref(3);
    const attending = ref(["Tim", "Bob", "Joe"]);
    function increaseCapacity() {
      capacity.value++;
    }
    const sapcesLeft = computed(() => {
      return capacity.value - attending.value.length;
    });
    return { capacity, increaseCapacity, attending, sapcesLeft };
  },
};
</script>

五、Reactive - 响应式语法

之前reactive 的 Ref 去声明所有的响应式属性

import { ref,computed } from &#39;vue&#39;
export default {
  setup(){
    const capacity = ref(4);
    const attending = ref(["Tim","Bob","Joe"]);
    const spacesLeft = computed(()=>{
      return capacity.value - attending.value.length
    })
    function increaseCapacity(){ capacity.value ++;}
    return { capacity,increaseCapacity,attending,spacesLeft}
  }
}

但是有另一个等效的方法用它去代替 reactive 的Ref

import { reactive,computed } from &#39;vue&#39;
export default {
  setup(){
    const event = reactive({
      capacity:4,
      attending:["Tim","Bob","Joe"],
      spacesLeft:computed(()=>{
        return event.capacity - event.attending.length;
      })
    })
  }
}

过去我们用vue2.0的data来声明响应式对象,但是现在在这里每一个属性都是响应式的包括computed 计算属性

这2种方式相比于第一种没有使用.

接下来 我们再声明method 这2种语法都ok,取决于你选择哪一种

setup(){
  const event = reactive(){
    capacity:4,
    attending:["Tim","Bob","Joe"],
    spacesLeft:computed(()=>{
      return event.capacity - event.attending.length;
    })
    function increaseCapacity(){event.capacity++}
    //return整个对象
    return {event,increaseCapacity}
  }
}
<p>Spaces Left:{{event.spacesLeft}} out of {{event.capacity}}</p>
<h2>Attending</h2>
<ul>>
	<li v-for="(name,index) in event.attending" :key="index">
     {{name}}
  </li>
</ul>
<button @click="increaseCapacity()"> Increase Capacity</button>

在这里我们使用对象都是.属性的方式,但是如果 这个结构变化了,event分开了编程了一个个片段,这个时候就不能用.属性的方式了

//在这里可以使用toRefs
import {reactive,computed,toRefs} from &#39;vue&#39;
export default{
  setup(){
    const event = reactive({
      capacity:4,
      attending:["Tim","Bob","Joe"],
      spacesLeft:computed(()=>{
        return event.capacity -event.attending.length;
        
      })
    })
    function increaseCapacity(){ event.capacity ++ }
    return {...toRefs(event),increaseCapacity}
  }
}

如果没有 increaseCapacity() 这个方法 直接可以简化为

return toRefs(event)

完整代码

<div>
   <p>Space Left : {{event.spacesLeft}} out of {{event.capacity}} </p>
   <h2>Attending</h2>
   <ul>
      <li v-for="(name,index)" in event.attending :key="index">{{name}}
      </li>


     
   </ul>
   <button @click="increaseCapacity">Increase Capacity</button>
   </div>
</template>

<script>
//第一种
import {ref,computed } from &#39;vue&#39;
export default {
  setup(){
    const capacity = ref(4)
    const attending = ref(["Tim","Bob","Joe"])
    const spaceLeft = computed(()=>{
      return capacity.value - attending.value.length;
    });
    function increaseCapacity(){ capacity.value++; }
    return {capacity,increaseCapacity,attending,spaceLeft}   


  }
} 

//返回一个响应式函数 第二种
import { reactive,computed } from &#39;vue&#39;
export default {
  setup(){
    const event = reactive({
      capacity:4,
      attending:["Tim","Bob","Joe"],
      spaceLeft:computed(()=>{
        return event.capacity - event.attending.length;
      })
    })
    //我们不再使用.value
    function increaseCapacity() { event.capacity++; }
    //把这个event放入到template中
    return { event,increaseCapacity}
  }
}


</script>

六、 Modularizing

使用CompositionAPI的两个理由

1、可以按照功能组织代码

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

2、组件间功能代码复用

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

七、 LifecycleHooks - 生命周期钩子

Vue2 Vue3
beforeCreate ❌setup(替代)
created ❌setup(替代)
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeDestroy onBeforeUnmount
destroyed onUnmounted
errorCaptured onErrorCaptured
- ?onRenderTracked
- ?onRenderTriggered

setup中调用生命周期钩子

import { onBeforeMount,onMounted } from "vue";
export default {
  setup() {
    onBeforeMount(() => {
        console.log(&#39;Before Mount!&#39;)
    }) 
    onMounted(() => {
        console.log(&#39;Before Mount!&#39;)
    }) 
  },
};

八、Watch - 监听器

// 所有依赖响应式对象监听
watchEffect(() => {
   results.value = getEventCount(searchInput.value);
 });

// 特定响应式对象监听
watch(
  searchInput,
  () => {
    console.log("watch searchInput:");
  }
);

// 特定响应式对象监听 可以获取新旧值
watch(
  searchInput,
 (newVal, oldVal) => {
    console.log("watch searchInput:", newVal, oldVal);
  },
);

// 多响应式对象监听
watch(
  [firstName,lastName],
 ([newFirst,newLast], [oldFirst,oldlast]) => {
   // .....
  },
  
);

// 非懒加载方式监听 可以设置初始值
watch(
  searchInput,
  (newVal, oldVal) => {
    console.log("watch searchInput:", newVal, oldVal);
  },
  {
    immediate: true, 
  }
);

九、Sharing State - 共享状态

[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

编写一个公共函数usePromise函数需求如下:

  • results : 返回Promise执行结果
  • loading: 返回Promise运行状态
    • PENDING :true
    • REJECTED : false
    • RESOLVED: false
  • error : 返回执行错误

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

import { ref } from "vue";

export default function usePromise(fn) {
  const results = ref(null);
  // is PENDING
  const loading = ref(false);
  const error = ref(null);

  const createPromise = async (...args) => {
    loading.value = true;
    error.value = null;
    results.value = null;
    try {
      results.value = await fn(...args);
    } catch (err) {
      error.value = err;
    } finally {
      loading.value = false;
    }
  };
  return { results, loading, error, createPromise };
}

应用

import { ref, watch } from "vue";
import usePromise from "./usePromise";
export default {
  setup() {
    const searchInput = ref("");
    function getEventCount() {
      return new Promise((resolve) => {
        setTimeout(() => resolve(3), 1000);
      });
    }

    const getEvents = usePromise((searchInput) => getEventCount());

    watch(searchInput, () => {
      if (searchInput.value !== "") {
        getEvents.createPromise(searchInput);
      } else {
        getEvents.results.value = null;
      }
    });

    return { searchInput, ...getEvents };
  },
};

十、Suspense - 悬念

复杂的Loading实现

我们考虑一下当你加载一个远程数据时,如何显示loading状态

通常我们可以在模板中使用v-if

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

但是在一个组件树中,其中几个子组件需要远程加载数据,当加载完成前父组件希望处于Loading状态时我们就必须借助全局状态管理来管理这个Loading状态

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

Suspense基础语法

这个问题在Vue3中有一个全新的解决方法。

这就是Suspense Component,悬念组件。

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

<template>
  <div>
    <div>Uh oh .. {{ error }}</div>
    <suspense>
      <template>
        <div>
          <event></event>
          <asyncevent></asyncevent>
        </div>
      </template>
      <template> Loading.... </template>
    </suspense>
  </div>
</template>

<script>
import { ref, onErrorCaptured, defineAsyncComponent } from "vue";

import Event from "./Event.vue";

const AsyncEvent = defineAsyncComponent(() => import("./Event.vue"));
export default {
  components: {
    Event,
    AsyncEvent,
  },

  setup() {
    const error = ref(null);
    onErrorCaptured((e) => {
      error.value = e;
      // 阻止错误继续冒泡
      return true;
    });
    return { error };
  },
};
</script>

骨架屏实现

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

十一、Teleport - 传送门

功能

类似React中的Portal, 可以将特定的html模板传送到Dom的任何位置

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

基础语法

通过选择器QuerySelector配置

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

示例代码

1[Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3

<template>
  <div>
    <teleport>
      <!-- 【Teleport : This should be at the end 】 -->
      <div>
        <video>
          
        </video>
      </div>
    </teleport>
    <div>【Teleport : This should be at the top】</div>
    <button>Toggle showText</button>
  </div>
</template>
<script>
import { ref } from "vue";
export default {
  setup() {
    const showText = ref(false);
    setInterval(() => {
      showText.value = !showText.value;
    }, 1000);
    return { showText };
  },
};
</script>

更多编程相关知识,请访问:编程入门!!

Atas ialah kandungan terperinci [Kompilasi dan ringkasan] Penjelasan terperinci tentang 11 mata pengetahuan Vue3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:poetries. Jika ada pelanggaran, sila hubungi admin@php.cn Padam