vue 快速学习所有知识或复习笔记

创建项目:

https://primarycolor.blog.csdn.net/article/details/112239661

一、定义响应式数据和事件方法。

代码:

<template>
    <!--vue3不需要写根组件了-->
    <div>{{num}}</div>
    <div>{{name}}</div>
    <div>{{arr}}</div>
    <div>{{obj.age}}</div>
    <div>{{username}}</div><!--username是data对象的属性,但是return的时候使用了...toRefs方法,也就不需要通过data来访问username。
    <div>
      <button @click="add"></button>
    </div>
    <div>{{num1}}--{{num2}}--{{num3}}</div>
</template>
<script>
Home.vue:
//编写js内容的
import {defineComponent,ref,reactive,toRefs,watchEffect,watch,computed} from 'vue'
export default defineComponent({
    name:'Home',//组件名称
    //接收父组件的数据
    props:{},
    //定义子组件
    components:{},
    setup(props,ctx){    //所有定义的数据在这里面
      let num=ref(1)    //定义数据,方式一。
      let data=reactive({username:'jack'});//定义数据,方式二。
      let name=ref('jack')
      let arr=ref([2,23,0,18,0])
      let obj=ref({
        age:20
      })
      //谁用了谁,被调用的方法必须写在调用的前面,不然无法调用,如果是function的定义函数就不会出现先后问题。
      let fn=()=>{
        console.log('这是fn')
      }
      //定义方法
      const add=()=>{
        //访问定义的数据
        //ref定义的数据,数据名.value
        num.value++;
        //reactive定义的数据,直接访问。
        data.username='tom'
        fn();//可以直接调用另一个方法,不需要加this
      }

      //监听ref或者reactive定义的数据
      //只要数据变化就会重新执行watchEffect
      //需要用到监听的数据
      //watchEffect返回一个停止监听的函数
      let stopWatchEffect=watchEffect({
        console.log(num.value)
        console.log(data.name)
        if(num.value==5){
          stopWatchEffect();//当num的值为5时,停止监听器
        }
      });
      //watch是监听某一个或者某几个数据,需要制定数据源
      watch(()=>num.value,(val,oldVal)=>{
        console.log('旧值新值:',oldVal,val);
      });
      watch(()=>data.name,(val,oldVal)=>{
        console.log('旧值新值:',oldVal,val);
      });
      //一次性监听多个值
      //deep是深度监听,如果监听的是对象或者数组,需要设置deep为true
      //immediate是立即监听,页面已进入,就会执行一次watch。
      let stopWatch=watch(()=>[nu m.value,data.name],(val,oldVal)=>{
        console.log('旧值新值:',oldVal,val);//最后输出的形式:[num.value,data.name]
        if(val[0]==5){
          stopWatch();//停止watch
        }
      },{deep:true,immediate:true});//{deep:true,immediate:true}跟vue2相似,是否深度监听和是否立即执行

      //计算属性
      let num1=ref(10)
      let num2=ref(20)
      let num3=computed(()=>{
        //必须return一个具体的值
        return num1.value+num2.value;
      });
      return{
        ...toRefs(data),通过reactive定义的需要调用toRefs
        num,
        name,
        arr,
        obj,
        add,
        fn,
        num1,
        num2,
        num3
      }
    }
})
</script>
<style scoped lang='scss'>
</style>

相关函数:        //跟react类似,需要调用函数来声明响应式函数。 
defineComponent:定义组件
ref:定义数据


二、路由。

router/index.js文件内容说明:

import {createRouter,createWebHistory} from 'vue-router'//createRouter:创建路由,

相关知识:

1.createWebHistory:创建路由模式。

2.除了首页和父路由之外,其他路由都通过懒加载路由的方式。注意父路由不要用懒加载哈。
其他内容跟vue2相同。

3.history模式链接路径没有“#”,hash模式有“#”。

跳转路由的方式:

import {useRouter} from 'vue-router'
//...省略部分代码
setup(){
  //useRouter会返回全局的路由对象
  let router=useRouter()
  let goto=()=>{
    //跳转路由
    //1.push跳转
    router.push('/about');
    router.push({
      path:'/about',//也可以使用name:'About'方式
      //跳路由传参数。
      query:{
        
      }
    })
    //2.replace替换页面
    router.replace('/about')
    router.replace({
      path:'/about',//也可以使用name:'About'方式
    })
    //后退
    router.back();
    //前进
    router.forward();//很少用,只有回退后的页面可以调用
    //前进到哪一个缓存页面
    router.go(1);//router.go(-1)等于回退一级页面。
  }
  
}

三、跳转路由方式和传参。

1.跳路由传参方式。
query:参数会显示到浏览器链接中

router.push({
      path:'/about',//也可以使用name:'About'方式
      //跳路由传参数。
      query:{
        id:'1',//跟vue2相似。
      }
    })

param:参数不会显示到浏览器链接中

router.push({
      name:'About',//params只能使用name方式
      //跳路由传参数。
      params:{
        id:'1',//跟vue2相似。
      }
    })

2.获取传递的参数。

import {useRoute} from 'vue-router'
setup(){
  //当前路由对象
  let route=useRoute();
  console.log(route.query);//获取query传参方式的参数
  console.log(route.params);//获取params传参方式的参数
}

四、路由守卫。

1.路由守卫:
router/index.js:

//路由守卫
//全局进入路由的守卫函数
//to:要进入的路由
//from:从哪个路由来
//next:是一个函数,必须要调用它,否则程序就会阻塞。
router.beforeEach((to,from,next)=>{
    next();
});

//全局离开的。
router.afterEach((to,from,next)=>{
    next();
});

2.组件内守卫:

import {onBeforeRouteLeave} from 'vue-router'
setup(){
  onBeforeRouteLeave((to,from)=>{
    console.log(to,from);
  });
}

五、状态管理。

1.定义数据。

store/index.js:

import {createStore} from 'vuex'
export default createStore({
  //如何定义状态管理数据
  state:{
    name:'jack111'
  },
  //同步修改state的值
  mutations:{
    setName(state,val){
      state.name=val
    }
  },
  actions:{
  },
  modules:{
  }
})

2.获取数据。

import {defineComponent,computed,ref} from 'vue'
import {useStore} from 'vuex'
setup(){
  let store=useStore();
  //获取vuex中数据
  let name=computed(()=>store.state.name);
  console.log('vuex中的数据:',name)
  //修改vuex中的数据
  store.commit('setName','tom')//commit调用mutation中的方法。
}

上一篇:C#中ref、out、in的区别与使用


下一篇:[react] 请说说什么是useRef?