vue2.0到3.0有这一篇就够了

162 阅读1分钟

vue3.0学习

基本框架

<template>
    <div class="">
        
    </div>
</template>

<script setup>
import {} from 'vue'
    
</script>

<style lang="scss" scoped>
    
</style>

vue3.2版本推出了setup语法糖,不用向之前vue3.0,写完函数还要return出去。vue3.0推出了组合式api,下面演示如何定义变量。

<script setup>
import {ref,reactive} from 'vue'
    let number = ref(0)
    let data = reactive({
        tableData:[]
    })
    let changeNumber = ()=>{
        number.value = 1
        data.tableData = [{value:"演示数据"}]
    }
</script>
注意,在js里面使用ref定义的值需要.value,但是在html中显示变量不用写.value。

vue3.0使用生命周期函数。

<script setup>
import {ref,reactive,onMounted} from 'vue'
    let number = ref(0)
    let data = reactive({
        tableData:[]
    })
    let changeNumber = ()=>{
        number.value = 1
        data.tableData = [{value:"演示数据"}]
    }
    onMounted(()=>{
        changeNumber()
    })
</script>
需要注意,vue3.0使用生命周期需要在vue中进行引入,生命周期均是在vue2.0的基础上面加了on,另外3.0版本没有生命周期onBeforeCreate和onCreated,setup代替了这两个生命周期,另外在setup中无法使用this。

vue3.0使用侦听器和计算属性

<script setup>
import {ref,reactive,onMounted,watch,watchEffect,computed} from 'vue'
    let number = ref(0)
    let data = reactive({
        tableData:[]
    })
    //监听数值
    watch(number,(n,o)=>{
        console.log(n,o);
    },{immediate:true})//是否开启首次监听
    //监听对像中的某一项值
    watch(()=>data.tableData,(n,o)=>{
        console.log(n,o);
    })
    watchEffect(()=>{
        let m = number.value
        console.log("number值发生改变",m);
    })
    //计算属性
    let titles = computed(()=>{
        return data.tableData.title
    })
</script>

vue3.0父子组件传值

<!-- 父组件 -->
<template>
    <div class="">
        <child @fuzu="fuzu" :data="data.tableData" />
    </div>
</template>


<script setup>
import {ref,reactive,onMounted,provide} from 'vue'
import child from '../child.vue'
    let number = ref(0)
    let data = reactive({
        tableData:[]
    })
    let changeNumber = ()=>{
        number.value = 1
        data.tableData = [{value:"演示数据"}]
    }
    //接受子组件的值
    const fuzu = (e)=>{
        alert(e)//子组件传过来的值
    }
    //第二种传值方式
    provide("erzi","父组件传过来的信息")
    onMounted(()=>{
        changeNumber()
    })
</script>

<!-- 子组件 -->
<template>
    <div class="">
        {{data}}
        {{info}}
        <button @click="checkBox">子组件按钮</button>
    </div>
</template>


<script setup>
import {ref,reactive,onMounted,defineProps,inject,defineEmits} from 'vue'
    let props = defineProps({
        data:{
            type:Array,
            default: '默认值'
        }
    })
    let number = ref(0)
    let data = reactive({
        tableDatas:[]
    })
    //子组件向父组件传值
    const emit = defineEmits(["fuzu"])
    const checkBox = ()=>{
        emit("fuzu","子组件传来的值")
    }
    //接受父组件的传值
    let info = inject("erzi")
    onMounted(()=>{
        //使用父组件传过来的值
        data.tableDatas = props.data
        changeNumber()
    })
</script>
需要注意,由于没有了this,所有子组件向父组件传值时需要引入defineEmits来定义事件的名称,另外provide,inject这种传值比普通的props传值更方便,父组件传的值可以在后代组件中取到(据说provide inject可以取代vuex😜)。

vue3.0中路由跳转的使用

<script setup>
import {ref,reactive,onMounted} from 'vue'
//第二种方式是把路由的文件直接引过来
import router from '../router/index.js'
import { useRouter } from 'vue-router'
    //第一种方式
    let router = useRouter()
    router.push("/")
</script>

vue3.0中vuex的使用

<script setup>
import {ref,reactive,onMounted} from 'vue'
import {useStore} from 'vuex'
let store = useStore(store)
//获取vuex中user中username的值
let user = computed(()=>store.state.user.username)
let changeVuex = ()=>{
    store.commit("user/SET_USERINFO",obj)
}
</script>

vuex user文件

const user = {
  namespaced: true,
  state: {
    username: "管理员",
    password: ""
  },

  mutations: {
    SET_USERINFO: (state, userInfo) => {
      state.username = userInfo.username ? userInfo.username : "";
      state.password = userInfo.password ? userInfo.password : "";
    }
  },

  actions: {
    // 登录
    Login({ commit }, userInfo) {
      commit("SET_USERINFO", userInfo)
    }
  }
};
export default user;

vue3.0模板引用refs

<template>
    <div class="">
        <div refs="div"></div>
    </div>
</template>


<script setup>
import {ref,reactive,onMounted,provide} from 'vue'
    let div = ref(null)
    onMounted(()=>{
        console.log(div.value)//获取div元素
    })
</script>