Rumah > Artikel > hujung hadapan web > Mari kita bincangkan tentang cara pembangun Vue2 boleh bermula dengan cepat menggunakan Vue3
Bagaimana untuk bermula dengan Vue3 dengan cepat? Artikel berikut akan membandingkan Vue2 dan Vue3, dan memperkenalkan cara pembangun Vue2 boleh bermula dengan cepat dengan Vue3. Saya harap ia akan membantu semua orang.
Pengarang ialah pembangun Vue2 React sebelum ini Memandangkan projek itu perlu dimulakan terus dengan Vue3, saya akan mempelajarinya dengan cepat dan membandingkan beberapa perbezaan yang berkaitan dengan React. Prasyarat untuk membaca: 已经上手了Vue2的开发
, isu utama yang dibincangkan dalam artikel ini:
Ciri baharu Vue3
Beberapa perbezaan antara Vue2 dan Vue3
Cara pembangun Vue2 boleh bermula dengan cepat dengan Vue3
Perbandingan mudah antara Vue3 dan React
Ditulis dalam perpustakaan Komponen Vue3
(Mempelajari perkongsian video: tutorial video vue)
单节点
, templat Vue3 menyokong 多节点
, serupa dengan serpihan bertindak balas变化
pada asasnya dalam skrip Dalam (Pilihan api -> Komposisi api), anda tidak akan melihat ini memenuhi skrin lagi! ! ! v-bind
Proxy
ialah API penyemak imbas terkini dengan fungsi yang lebih berkuasa. Vue2.7
Flow
Facebook, yang tidak dapat menyokong dengan sempurna TypeScript
(jadi pemilihan teknologi pada peringkat awal projek adalah sangat penting) 完全重写
, yang menyediakan TS yang sama sokongan sebagai React Pina
vite
Sokongan, termasuk vitest
, dsb., pegawai menyediakan lebih banyak alatan persisian 性能更好,体积更小
Tidak perlu dikatakan 事件监听缓存
, fungsi yang serupa dengan @click binding tidak perlu dibuat beberapa kali dan diletakkan dalam cacheHandler cache SSR
: Vue 3.0 akan terus menukar teg statik ke dalam teks, dan JSX akan ditukar terlebih dahulu berbanding dengan React ke DOM maya, dan kemudian menukar DOM maya kepada HTML Vue3 adalah lebih pantas Use Hooks
Tinggalkan campuran yang lalu dan gunakan Hooks. untuk menyelesaikan beberapa kekurangan campuran masa lalu Pengoptimuman algoritma diff
动静结合
, yang merupakan pencapaian prestasi yang sangat besar. Mengangkat kod di luar fungsi pemaparan mengelakkan penciptaan semula objek ini pada setiap pemaparan, meningkatkan penggunaan memori dan mengurangkan kekerapan pengumpulan sampah. 模版整体大小相关
动态内容的数量相关
Pengurusan kod sumberpoly-repo
mono-repo
tanpa bergantung pada keseluruhan vue.js dan mengurangkan saiz pakej rujukan, tetapi vue2.x tidak boleh melakukan ini. 独立于
单独依赖reactive
API Baharu
Apakah itu API gubahan? - Vue rasmi
setup
baharu dilaksanakan sebelum komponen dicipta Sebaik sahaja props
dihuraikan, ia akan digunakan sebagai titik masuk API komposit. await语法
<script lang="ts" setup></script>
, atau anda boleh Gabungkan dengan export default
, gunakan <script> const result = await Http.get('/getUserInfo') </script> // or export default { setup(props, context) { // Attribute (非响应式对象,等同于 $attrs) console.log(context.attrs) // 插槽 (非响应式对象,等同于 $slots) console.log(context.slots) // 触发事件 (方法,等同于 $emit) console.log(context.emit) // 暴露公共 property (函数) console.log(context.expose) } }
基础类型
data responsif.value
perlu digunakan dalam skrip. Memanggil Terdapat beban mental tertentu, terutamanya. Ia juga dinyatakan dengan jelas bahawa akses langsung dalam skrip tidak akan disokong. Sebabnya ialah jenis asas tidak boleh memintas perubahannya Sudah tentu, sesetengah orang telah mencadangkan menggunakan sintaks yang serupa dengan String('foo') baharu untuk membungkus jenis asas. Secara peribadi, adalah baik untuk terus menggunakan reaktif yang disokong
Ref
takrifan tsimport { type Ref } from 'vue';
isRef
Tentukan sama ada ia objek ref. Secara amnya, pembolehubah yang dicipta oleh ref, toRef, toRefs toRefs
Dekonstruksi reactive对象
menjadi satu objek responsif shallowRef
Cipta ref yang menjejaki perubahan .valuenya sendiri, tetapi tidak not Ia akan menjadikan nilainya responsif, yang hanya difahami sebagai mencipta pembolehubah tidak responsif dengan struktur yang sama seperti ref triggerRef
untuk memaksa halaman DOM dikemas kini. Walaupun ref yang dibuat tidak berubah, jika anda ingin mengemas kini dom, anda boleh menggunakan customRef
untuk menyediakan get dan set serupa dengan pengiraan, dan anda boleh menyesuaikan tingkah laku ref 引用类型
Intipati proxy对象
递归的
直接解构
. Menukar alamat rujukan jenis rujukan secara langsung juga akan menyebabkan kehilangan responsiftoRefs
readonly
shallowReactive
import { reactive, toRefs } from 'vue' const book = reactive({ author: 'Vue Team', year: '2020', title: 'Vue 3 Guide', description: 'You are reading this book right now ;)', price: 'free' }) let { author, title } = toRefs(book) title.value = 'Vue 3 Detailed Guide' // 我们需要使用 .value 作为标题,现在是 ref console.log(book.title) // 'Vue 3 Detailed Guide'4. Kitaran hayat
<script> import { onMounted } from 'vue'; const getUserInfo = () => { console.log('获取用户信息'); }; onMounted(getUserInfo); </script>
watch(() => articleInfo.author, (newVal) => {})
,第一个参数为箭头函数返回要监听的目标属性import { ref, reactive, watch } from 'vue' const counter1 = ref(0) const counter2 = ref(0) // 监听多个 watch([counter1, counter2], (newValue, oldValue) => { console.log('The new counter1 value is: ' + counter1.value) console.log('The new counter2 value is: ' + counter2.value) }) const obj = reactive({ name: 'JJ', age: 18 }) // 深度监听对象 watch(obj, (newValue, oldValue) => { console.log('The new obj value is: ' + obj.value) }, { deep: true, immediate: true }) // watch监听单个属性 watch(() => obj.name, (newValue, oldValue) => { console.log('The new obj value is: ' + obj.value) }, { deep: true, immediate: true })
响应式的属性
watchEffect
是拿不到的。显式
指定依赖源,watchEffect - 自动
收集依赖源可以理解为watchEffect 就是配置了{ immediate: true } 的watch
antfu小哥
:推荐在大部分时候用 watch 显式的指定依赖以避免不必要的重复触发,也避免在后续代码修改或重构时不小心引入新的依赖。watchEffect 适用于一些逻辑相对简单,依赖源和逻辑强相关的场景(或者懒惰的场景 )。const stopWatch = watchEffect( (oninvalidate): void => { oninvalidate(() => { console.log("前置校验函数"); }); // 引用了响应式的属性 count console.log("watchEffect count变化", count.value); }, { // 副作用刷新时机 flush 一般使用post // 可选:pre(组件更新前执行)/sync(强制效果始终同步触发)/post(组件更新后执行) flush: "post", // 开发调试 onTrigger() { console.log("开发调试"); }, } );
import { ref, computed } from 'vue' const counter = ref(0) const twiceTheCounter = computed(() => counter.value * 2) // get set写法 const plusOne = computed({ get: () => counter.value + 1, set: (val) => { counter.value = val - 1 }, }) plusOne.value = 1 console.log(counter.value) // 0 counter.value++ console.log(counter.value) // 1 console.log(twiceTheCounter.value) // 2
// template <suspense> <template> <asynccomponent></asynccomponent> </template> <template> <div>loading...</div> </template> </suspense> // script const AsyncComponent = defineAsyncComponent(() => import('./asyncComponent.vue'))
Teleport 是一种能够将我们的模板渲染至指定DOM节点,不受父级style、v-show等属性影响,但data、prop数据依旧能够共用的技术;类似于 React 的 Portal
。之前写react是不怎么用这个属性,vue3这个估计也没多大用。
主要解决的问题 因为Teleport节点挂载在其他指定的DOM节点下,完全不受父级style样式影响
to 属性 插入指定元素位置,body,html,自定义className等等
<teleport> <loading></loading> </teleport>
defineXxxx 无需import即可直接使用
和vue2一致
两者用法,除了pina没有Mutations,差别不大。但是官方推荐的东西,自然有它的各种优点
react中 {{}} => {}
import { ref } from 'vue' let v = ref<string>('') const renderDom = () => { return ( <input> <div> {v.value} </div> > ) } export default renderDom</string>
无需导入xxx,import { reactive,ref } from "vue";
,只需要用即可
自定义组件名称,需要引入插件unplugin-vue-define-options
,并在vite中配置
import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import DefineOptions from 'unplugin-vue-define-options/vite'; export default defineConfig({ plugins: [vue(), DefineOptions()], });
不使用插件,也可以通过多写一个script标签来单独写options
<script> export default { name: "TButton", }; </script> <script> defineOptions({ name: 'TButton', }); </script>
或者通过项目配置,指定相关插件配置
import { Directive } from "vue"; const vMove: Directive = { mounted(el: HTMLElement) { let moveEl = el.firstElementChild as HTMLElement; const mouseDown = (e: MouseEvent) => { //鼠标点击物体那一刻相对于物体左侧边框的距离=点击时的位置相对于浏览器最左边的距离-物体左边框相对于浏览器最左边的距离 console.log(e.clientX, e.clientY, "-----起始", el.offsetLeft); let X = e.clientX - el.offsetLeft; let Y = e.clientY - el.offsetTop; const move = (e: MouseEvent) => { el.style.left = e.clientX - X + "px"; el.style.top = e.clientY - Y + "px"; console.log(e.clientX, e.clientY, "---改变"); }; document.addEventListener("mousemove", move); document.addEventListener("mouseup", () => { document.removeEventListener("mousemove", move); }); }; moveEl.addEventListener("mousedown", mouseDown); }, };
用了react hook的人都知道很香,vue3支持这个相当不错,能解决很多业务场景的封装
可以当做mixins写
// useWindowResize import { onMounted, onUnmounted, ref } from "vue"; function useWindowResize() { const width = ref(0); const height = ref(0); function onResize() { width.value = window.innerWidth; height.value = window.innerHeight; } onMounted(() => { window.addEventListener("resize", onResize); onResize(); }); onUnmounted(() => { window.removeEventListener("resize", onResize); }); return { width, height }; } export default useWindowResize;
Vue3 的依赖追踪是全自动的,不需要担心传了错误的依赖数组给 useEffect/useMemo/useCallback 从而导致回调中- 使用了过期的值
Vue3 Hook也没React Hook那么多限制,后续用用看怎么样
笔者vue3也刚用不久,如有错误,还请兄弟们指出
本文所有demo都在该仓库中JJ-UI 一款Vue3组件库,参考大佬文章刚刚搭建好,后续会基于这个架子开发自己的vue3组件库
Atas ialah kandungan terperinci Mari kita bincangkan tentang cara pembangun Vue2 boleh bermula dengan cepat menggunakan Vue3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!