VUE学习笔记

Vue前端

基础

利用Vite创建Vue项目

npm init vite@latest <project-name> --template vue
$ cd <project-name>
$ npm install
$ npm run dev

Setup的使用

  • 组合式api的入口

响应式数据

2.ref 响应式数据

  • ​ ref会改变视图层,但是不会改变源数据,本质时拷贝一份数据

  • import {ref} from 'vue'//也可以不写
    
  • const name =ref('***')
    //需要更新的时候直接在方法中调用如下
    function btn(){
    name.value='****'
    }
    //变化对象
    const obj=ref({a:'XXX',b:'xxx'})
    obj.value.a='xxxx'
    //数组
    const arr=ref([{a:'0'}])
    arr.value[x].a=''
    
    

    使用ref最好做一个数组类型的

3.reactive响应式引用,不能用来定义基本普通类型

  • import {reactive} from 'vue'
    //不需要使用.value
    const obj=reactive({a:'XXX',b:'xxx'})
    obj.a='xxx'
    

4.toRef响应式数据

  • 不更新试图层,但是会改变原始数据

  • import {toRef} from 'vue'
    const obj={name:'xxx',age:'xxx'}
    const res=toRef(obj,name)
    res.value='xxx'
    

5.toRefs

  • 接收响应式对象

  • 使用toRefs可以省略name.value.a这样的步骤了,直接用a

  • <span>{{a}}</span><span>{{b}}</span><span>{{c}}</span>
    const obj={a:'x',b:'x',c:'x'}
    const news=reactive(obj)
    return {btn,...toRefs(news)}
    

计算属性

  • 视图层可以用v-model绑定值
    import {computed} from 'vue'
    const sum=computed(()=>{
    	return a+b;
    })
    return {sum}
    

watch监听属性

  • 监听页面值的变化

  • //监听一个ref数据变化
    watch(p1,(newval,oldval)=>{
    	写方法
    })
    //监听多个ref的数据变化
    watch([p1,p2],(newval,oldval)=>{
    	写方法
    })
    //监听整个reative响应式数据变化:只能监听到最新的结果
    //监听reative某一个数据相应数据变化:可以得到新旧数据
    watch(()=>p..age.num,(newval,oldval)=>{
    	方法
    }),(immdiate:true)//(immdiate:true)进入页面立即监听
    
    

watchEffect

  • 开始的时候就会监听

  • 不需要调用,

  • const res=warchEffect(()=>{
    
    })
    //停止监听
    res()
    

组件间的传值

  • //自动传值
    provide('name')//传
    const p1=inject('name')//收
    //点击传值
    //父组件
    <div ref="val"></div>
    setup(){
    	const val=ref();
    	const p1=ref('dfdf')
         function btn(){
    		val.value.abc(p1)
         }
    	return {btn}
    }
    子组件
    val是需要被传过来都值
    function abc(val){
    	
    }
    return abc
    

<Style scopend>当前页面生效

Vuex在各个页面之间传值

  • 安装

  • npm install vuex#next --save
    //引入
    import {userStore} from 'vuex'
    
  • 新建数据仓库store文件夹

  • import {createStore} from 'vuex'
    
    export default createStore({
    	//创建数据仓库
    	state:{name:'xxx'},
    	//写计算属性
    	getter:{
    	
    	},
    	//同步调用
    	//使用以下方法调用数据仓库里面的数据
    	mutations:{
    	
    	}
    	//异步调用
    	actions:{
    	
    	},
    	//模块导入
    	modules:{
    	
    	}
    })
    
    //main.js
    import createStore from '上面的路径'
    加载到app中
    
    
    //页面中
    import {useStore} from 'vuex'
    //从仓库中取到数据
    const store =useStore();
    //利用计算属性得到
    const res=computed(()=>{
    	return store.state.name
    
    })
    
    

    vuex模块管理

  • 创建模块

    const user={
    	state:()=>({
    		username:'',
    	}),
    	mutations:{
    	setTimeout(()=>{
              
         },时间)
    	}
    }
    export default user
    
  • 导入模块

  • import user from './user'
    modules:{
     user
    }
    
  • 引用数据

  • $store.state
    
  • 改变数据仓库中的数据

  • //在mutation	actions中写入函数
    //在异步调用改数据仓库中的值时,需要调用同步调用
    //异步调用方法store.dispatch('方法名')
    //tong调用方法store.commit('方法名')
    mutations:{
    	方法名(state){
    	//state.name=''
    	}
    }
    actions:{
    	方法名(store){
    	//调用同步中的方法
    	store.commit('同步中的方法名',参数)
    		
    	}
    }
    

生命周期函数

beforeCreate
//在实例初始化之后、进行数据侦听和事件/侦听器的配置之前同步调用。
created
//在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且 $el property 目前尚不可用。
beforeMount
//在挂载开始之前被调用:相关的 render 函数首次被调用。该钩子在服务器端渲染期间不被调用。
beforeUpdate
//在数据发生改变后,DOM 被更新之前被调用。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。
updated
/*在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。
当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或侦听器取而代之。*/
activated
//被 keep-alive 缓存的组件激活时调用。该钩子在服务器端渲染期间不被调用。
deactivated
//被 keep-alive 缓存的组件失活时调用。该钩子在服务器端渲染期间不被调用。
beforeUnmount
//在卸载组件实例之前调用。在这个阶段,实例仍然是完全正常的。该钩子在服务器端渲染期间不被调用。
unmounted
//卸载组件实例后调用。调用此钩子时,组件实例的所有指令都被解除绑定,所有事件侦听器都被移除,所有子组件实例被卸载。该钩子在服务器端渲染期间不被调用
errorCaptured
//在捕获一个来自后代组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。
renderTracked
//跟踪虚拟 DOM 重新渲染时调用。钩子接收 debugger event 作为参数。此事件告诉你哪个操作跟踪了组件以及该操作的目标对象和键。
renderTriggered
//当虚拟 DOM 重新渲染被触发时调用。和 renderTracked 类似,接收 debugger event 作为参数。此事件告诉你是什么操作触发了重新渲染,以及该操作的目标对象和键。

  • 使用

    //在setup()中
    setup(){
    	onRenderTriggered(()=>{
              
         })
    }
    

vue3的抽离封装

  • 新建文件config,新建public.js

  • 公用的数据或方法,在public.js中写入公用的方法

  • //定义方法,然后方法
    用const abc=()=>{
    	const res_a=reactive({
    	响应式数据
    	})
    	return res_a
    }
    //抛出方法abc
    export default abc
    
  • import abc from '**/*/public.js'
    const res_a=abc()
    
    //改值(改的是视图层)
    res_a.name='xxx'
    

路由

安装

npm install vue-router@4 --save

创建文件夹router,新建index.js

import {createRouter} from "vue-router"
const routes=[
     {
		path:'/',
          name:'Login',
          //按需引入
          component:()=>import(/*webpackChunkNmae:'Login'*/ '@page/login/login.vue')
     }
]
const router = createRouter({
     history: createWebHsahHistory(),
     routes
})
export default router



在index中挂载
imort
app.use(router)

router路由跳转

  • 标签跳转

  • <router-link to=""></router-link>
    
  • js跳转,**注意:**跳转方法不能在setup中定义,因为setup中的this不可用,只能在methods中定义

  • 
    // 字符串
    this.$router.push('home')
    
    // 对象
    this.$router.push({ path: 'home' })
    
    // 命名的路由
    this.$router.push({ name: 'user', params: { userId: '123' }})
    
    // 带查询参数,变成 /register?plan=private
    this.$router.push({ path: 'register', query: { plan: 'private' }})
    

命名视图

<router-view name="header"></router-view>
const routes{
	path:'',
	computems:{
		default:,
		header:
	}
}

重定向

redirect:(to)=>{return {path:''} }

别名

alias('/path')

导航守卫

  • router中全部的地址

  • //
    router.beforeEach(to,from,next)=>(
    	return false//不访问
    	next()//访问
    )
    
  • 单独的

  • beforeEnter:(to,from)=>{
    	
    }
    

清除默认样式网站

normalize

ajax请求

let api='地址'
fetch('api').then(res=>res.json()).then(result=>{
	result
})

安装axios

npm install axios --save
let api=''
axios.get(api).then((result)=>{
     
})

vite配置跨域请求

新建vite.config.js文件(根目录)

module.exports={
		//配置代理服务器
		proxy:{
			'/api':{
				//目标
				target:'地址',
				//配置是否允许跨域
				changeOrigin:true,
				//设置重写
				rewrite:path=>path.replace(/^\/api/,'')
			}
		}
}

Mock.js

springboot跨域请求

@CrossOrigin

Element

安装

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import * as icons from '@element-plus/icons-vue'
// 引入element全局图标
Object.keys(icons).forEach(key => {
    app.component(key,icons[key])
});
app.use(ElementPlus, {locale: zhCn})  

js小技巧

按时间依次执行

setInterval(function(){/*Eachtime时间每次执行的语句*/},Eachtime)

计时

setTimeout(() => {/*timeout时间到了以后需要执行的语句*/}, timeout);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

事无巨细

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值