赞
踩
需要 node 在10 及以上
)node -v
// 安装脚手架
npm install -g @vue-cli
// 查看当前脚手版本--确保当前版本在 4.5.0 及以上,以便于支持创建最新版本的 vue3
vue --version
// 命令行创建项目:
vue create vue3-basic
// 图形化界面创建项目:
vue ui
/**
* 可以在 eslint 配置文件的 rules 里面,单独配置我们想要自定义的 rule
* rule 一共三个级别:
* 可以用: 0,1,2
* 也可以用 off warn error
*/
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
// 下面这条就是我自定义的
'vue/multi-word-component-names': 'off' ,
}
支持所有数据类型
总结:变量用 ref 包裹。要用啥就 return 啥
<template> <div class="hello"> <h1>{{ count }}</h1> <h1>这是 double 后的值:{{ double }}</h1> <button @click="increase">加一</button> </div> </template> <script lang="ts"> import { ref ,computed} from 'vue' export default { name: 'HelloWorld', setup() { // 通过 ref 包裹,让变量变成响应式对象 const count = ref(0) // 定义方法使用箭头函数 const increase = ()=>{ count.value ++ } const double = computed(() => { return count.value*2 }) return { /** * 此处原本应该写:count:count(key:value 格式),但是键值对 名字相同,可以简写。 */ count, // 方法同样需要导出 increase, double } } };
reactive 和 ref 相似点:
都能将数据编程响应式
不同点:reactive 只能包裹 引用数据类型
,如:Array、Object 、Map 、Set
而且,由于 reactive包裹后,要写 data.count 而不能直接 用 count ,很不方便,如实引入
toRefs
<template> <div class="hello"> <h1>{{ data.count }}</h1> <h1>这是 double 后的值:{{ data.double }}</h1> <button @click="data.increase">加一</button> </div> </template> <script lang="ts"> import { computed, reactive } from 'vue' interface DataProps { count: number; double: number; increase:()=> void; } export default { name: 'HelloWorld', setup() { const data:DataProps = reactive( { count: 0, increase: () => { data.count++ }, double: computed(() => { return data.count*2 }) }) return { data } } }; </script>
将数据转成
响应式数据
,就可以直接用插值语法使用。只适用于响应式对象的属性
<template> <div class="hello"> <h1>{{ count }}</h1> <h1>这是 double 后的值:{{ double }}</h1> <button @click="increase">加一</button> </div> </template> <script lang="ts"> import { computed, reactive, toRefs } from 'vue' interface DataProps { count: number; double: number; increase:()=> void; } export default { name: 'HelloWorld', setup() { const data:DataProps = reactive( { count: 0, increase: () => { data.count++ }, double: computed(() => { return data.count*2 }) }) // 可以通过 toRefs 将数据转成响应式数据 const refData= toRefs(data) return { /** * 将 refData 展开 * 等同于:count:refData.count、increase:refData.increase ..... */ ...refData } } }; </script>
直接前往 Vue.js官网查看
<script lang="ts"> // 引入想要使用的生命周期 import { onMounted,onUpdated } from 'vue' export default { name: 'HelloWorld', setup() { // 传入一个回调函数作为参数 onMounted(() => { console.log("Mounted") }) onUpdated(() => { console.log("Updated") }) } }; </script>
(重点)
@FilePath: \vue3-basic\src\hooks\useURLLoader.ts
import { ref } from 'vue' import axios from 'axios' function useURLLoader<T>(url:string) { const result = ref<T | null>(null) const loading = ref(true) const loaded = ref(false) const error = ref(null) axios.get(url).then((response) => { loading.value = false loaded.value = true result.value = response.data }).catch((e) => { error.value = e loading.value = false }) return { result, loading, loaded, } } export default useURLLoader
(远程传送)
<template>
// 通过 id 去寻找定位
<Teleport to="#modle">
<div id="center">
<h2>this is a model</h2>
</div>
</Teleport>
</template>
<div id="modle"></div>
Suspence 是 Vue3 推出的一个内置的特殊组件,通过使用 Suspense,返回一个 promise
<template>
<Suspense>
// 放异步请求之后的东西
<template #default>
<AsycShowVue />
</template>
// 这里面放异步请求完成前的 Loading 组件
<template #fallback>
<h1>Loading.....!</h1>
</template>
</Suspense>
</template>
注:可以在 setUp 中 用 onErrorCaptured 钩子函数捕获异步请求的错误
setup() {
const error =ref(null)
onErrorCaptured((e: any) => {
error.value = e
});
return {
error
};
},
(作用:用于全局变量共享,避免变量在层级很深的嵌套组件中传递)
<script lang="ts">
// 在父组件或根组件中引入 Provie
import { provide } from "vue";
export default defineComponent({
setup() {
const lang = ref('en')
// 定义想要传递的变量
provide('lang', lang)
},
});
</script>
<script lang="ts">
// 在子组件或层级更深的组件中中引入 inject
import { inject } from "vue";
export default defineComponent({
setup() {
const lang = inject('lang')
// 接受变量
return{
lang
}
},
});
</script>
import { createApp } from 'vue'
import App from './App.vue'
// 将用户名 定义为全局变量,然后即可在该实例下的所有组件中,用 inject去接收对应的变量
const app = createApp(App)
app.provide('currentUser', {name:'viking'})
app.mount('#app')
注意:需查看 package.json, 确保当前 vue3项目的版本在 3.2 以上)
优点:
<template> <div class="App-2"> <h1>这是 App2</h1> <h2>这是 count:{{ count }}</h2> <button @click="addCount">Add</button> <HelloWorld/> </div> </template> <script lang="ts" setup> import { ref } from 'vue' import HelloWorld from './components/HelloWorld.vue'; // 可以将暴露在顶层作用域中的变量直接 return 出去 const count = ref(0); const addCount = () => { count.value++ } </script> <style scoped lang="scss"> .App-2 { text-align: center; } </style>
(暂留)
后面抽空仔细看看 defineProps 和 defineEmits 的相关使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。