在vue3中我目前只接触了vue3.0与3.2这两个版本,而这两个版本虽然逻辑方式大同小异,但是的创建和代码写入方式却不同。 首先vue3.0的创建的方式是vue create 版本 项目名称 其写入代码的方式是
<template>
<div class="home">
<div>{{name}}</div>
<div>{{name1.uuname}}</div>
<div>{{uname}}</div>
<div>{{age}}</div>
<button @click="changeMyName">改变名字</button>
<button @click="rouabout">跳转到about</button>
</div>
</template>
<script>
import {ref,reactive,toRefs,onMounted} from "vue"
import {useRouter,useRoute} from "vue-router"
const changeNameWarpper=()=>{
let name=ref("谭伟")
const changeMyName=()=>{
name.value="杜澳"
}
return{
name,
changeMyName
}
}
export default {
name: 'Home',
components: {
},
setup(){
let router=useRouter()
// let name=ref("谭伟")
let name1=ref({uuname:"谭伟",age:24})
let user=reactive({uname:"谭伟",age:34})
// 相当于一个异步请求
const rouabout=()=>{
router.push({path:"/about",query:{id:0}})
}
setTimeout(()=>{
// name.value="杜澳"
name1.value.uuname="dffsd"
user=Object.assign(user,{uname:"杜澳",age:24})
// user.uname="杜澳"
},2000)
onMounted(()=>{
console.log("onMounted");
})
return{
rouabout,
// name,
...toRefs(changeNameWarpper()),
name1,
...toRefs(user) ,
onMounted
}
}
}
</script>
在写vue3.0的代码的时候我们不仅需要用import从vue中用大括号包裹的方式引入我们所需要的各种特殊代码比如ref,reactive,toRefs甚至各种生命周期也需要在其中引用。并且在需要跳转到其他页面时还需要用import从vue-router用大括号包裹的方式引入{useRouter,useRoute}并且还需要用定义一个变量将useRouter或useRoute用useRouter(),useRoute()方式赋值给我们定义的变量随后再用router.push({path:"/about",query:{id:0}})跳转及传参,另外虽然vue3.0与vue3.2定义事件和数据的方式大致一样,但是当时在vue3.0中定义数据和函数的方式有两种一种是在setup(){return{}}之外定义函数并且在还需要在setup中的return中抛出,另一种则是将vue2中的data(){retutn{}}变成setup(){return{}}并且定义的事件只有想这样
setup(){
let router=useRouter()
// let name=ref("谭伟")
let name1=ref({uuname:"谭伟",age:24})
let user=reactive({uname:"谭伟",age:34})
// 相当于一个异步请求
const rouabout=()=>{
router.push({path:"/about",query:{id:0}})
}
setTimeout(()=>{
// name.value="杜澳"
name1.value.uuname="dffsd"
user=Object.assign(user,{uname:"杜澳",age:24})
// user.uname="杜澳"
},2000)
onMounted(()=>{
console.log("onMounted");
})
return{
rouabout,
// name,
...toRefs(changeNameWarpper()),
name1,
...toRefs(user) ,
onMounted
}
}
放在setup(){return{}}才能发挥作用,并且在setup中定义的数据 还需要在setup中的return中抛出,否则则不起作用
而vue3.2的创建方式则是在vue3.0的基础上升级一下版本级别其审计的命令有两种,一种是npm i vue@3.2.8 vue-router@4.0.11 vuex@4.0.2,另一种是yarn add vue@3.2.8 vue-router@4.0.11 vuex@4.0.2运用这两种命令请vue3.0升级成3.2版本其写入代码与使其发挥作用的方式也各不相同在vue3.2中我们不需要在像vue3.0中呢让将数据写入到setup中然后再在setup中的return中抛出,而只需要将其改写成这样
<script setup>
}
</script>
然后在其中定义数据或者函数,就可以让我们定义的函数与数据项vue3.0一样发挥作用,不必再进行抛出。
再者它们引入组件的方式也不同
vue3.0引入组件时不仅需要用import将组件引入进来,还需要将组件名放入component中才能起作用
而vue3.2则是只需要用import将组件引入进来即可。
以上就是我目前所了解的vue3.0与vue3.2的不同。
接下来我所的就是我所了解的vue3.0与vue3.2的共同之处
在定义数据的时候如果数据是基本数据类型就用ref()包裹数据,如果是浮躁数据类型就用reactive()包裹数据
在使用生命周期时也都需要在vue中引入之后以这种方式写入
onMounted(() => {
})
如果vue3.0或vue3.2要使用axios进行二次封装调用时,它们都需要设置untils然后在其中设置request.js文件在其中写入
import axios from "axios";
import qs from "qs";
import { ElNotification } from 'element-plus';
import router from '../router'
const instance = axios.create({
baseURL: '/api',
// timeout: 10000,
});
// Add a request interceptor
// 添加请求拦截器
instance.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
config.data=(config.data instanceof FormData)?config.data:qs.stringify(config.data)
return config;
}, function (error) {
// Do something with request error
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
// Add a response interceptor
instance.interceptors.response.use(function (response) {
return response.status==200?response.data:response;
}, function (error) {
return Promise.reject(error);
});
export default instance
然后设置api文件夹之后设置api.js文件在其中引入untils文件夹中request.js文件 之后根据引入时的名字获取数据,比如这样
import axios from "../untils/request"
export function getUserList(data){
return axios({
method:"get",
url:"/users/list",
data
})
}
之后在需要的页面引入api文件中的api.js文件其接收数据的名字都需要在用大括号帮助里面的名字也要与api文件中的名字相同,然后根据引入室的名字,比如
import { getUserList } from '@/api/index';
import { onMounted, reactive, getCurrentInstance, computed, ref } from 'vue';
onMounted(() => {
getUserList(params).then(res => {
console.log(res);
let { data, total: t } = res;
total.value = t;
tableData.splice(0, tableData.length);
Object.assign(tableData, data);
}).catch(err => {
})
})
而如果要是用状态管理工具存储数据时则都需要
import { createStore } from 'vuex'
export default createStore({
state: {
username:'admin'
},
mutations: {
setName(state,val){
state.username = val
}
},
actions: {
setNameAction({commit},val){
commit('setName',val)
}
},
modules: {
}
})
在store文件中的 state: {},定义所要的数据之后在 mutations: {},中定义一个类似 setName(state,val){ state.username = val }的数据之后在 actions: {},中再定义一个类似 setNameAction({commit},val){ commit('setName',val) }的数据其中commit('setName',val)中的第一个参数的名字要与mutations中东一的函数名字相同,之后在需要的页面引入
import { useStore } from 'vuex';
之后这样写
// vuex 共享数据源
let store = useStore();
然后在需要的地方这样写
store.dispatch('setNameAction', username)
其中第一个参数要与store中actions: {},我们所定义的函数的名字相同
而如果要让数据持久的化的话在都需要安装插件,命令则是npm i vuex-persistedstate -S之后就需要在store文件中用import引入数据其引入的数据就是
import createPersistedState from 'vuex-persistedstate'之后就是在store抛出的对象中写入这些代码
plugins: [createPersistedState({
key: 'myStore', // 存储在localStorage的key名,默认为vuex
storage: window.localStorage
})]
之后数据就会在我们在以类似store.dispatch('setNameAction', username)这种方法提交数据时以本地存储的方式存入浏览器中。
总的来说vue3.0与vue3.2的代码逻辑基本上是相同的,只是写入的方式不同以及vue3.2较与vue3.0更加简便而已。