📋

常用语法vue实战

Created
Dec 30, 2022 10:40 AM
Tags
Vue
简介

Base

1.方法传参 注意单双引号的问题,不能同时使用

@click = "clickHandler($event,123)" // "clickHandler($event,'要单引号')"

 function(e,args){
	console.log(e) //event{}
	console.log(args) // 123
}

2.v-bind绑定class,可结合checked使用(勾选

<p :class="myclasses1">绑定多个class['class1','class2']</p>
<p :class="{'class1':checkValue1,'class2':checkValue3}">绑定多个或单个class用这种写法 "{'class1':checkValue1,'class2':checkValue3}"</p>
<p :class="[checkValue1?'class1':'',checkValue3?'class2':'']">绑定多个class的数组写法"[checkValue1?'class1':'',checkValue3?'class2':'']"</p>
<h2>属性 与 绑定class一样的写法</h2>
<p :style="checkValue2?{textShadow:'3px 5px 5px #656B79'}:''">绑定多个或单个属性,增加对象子项即可</p>
<p :style="checkValue2?myshadow:''">绑定属性</p>

3.v-if v-show

v-if :是动态操作DOM > v-show:修改display:none;
v-if不适合频繁切换,切换nav,建议用v-if.(组件较为复杂的) ;v-show有更高的初始渲染(如果不用显示,v-if会干脆不创建DOM)
//多个来回切换怎么写呢?

4.监听数组,对象的变化(3.0版本以下)

data(){
	return {

	}

}

watch: {
    newArr: {
      handler: function (val, oldVal) {
        console.log("watch");
        console.log(val, oldVal);
      },
      deep: true,
    },
  },
  computed: {
    newArr: function () {
      console.log("computed");
      return JSON.parse(JSON.stringify(this.myArr));
    },
  },

// 或者 简写
watch: {
	'myobj.name' :function(val,oldval) {
		
	}
}
methods: {
    myclick: function () {
      // this.$set(this.myArr, 0, 4);
      this.$delete(this.myArr, 0);
    },
  },
相关hack

5.vue-router路由语法

this.$router.push(),this.$router.replace();
App.vue 中设置<router-view/>
notion image
页面中直接跳转

6.页面缓存keep-alive

//没有父子组件之分

{
	path: "/about",
    name: "About",
    component: About,
		component:()=>import('./Abuout'),//异步加载组件,性能方面。
    meta:{
      keepAlive: true //需要被缓存,不需要就不写。
    }
}

<keep-alive>
	<router-view><router-view/>
<keep-alive/>

//以上是常规的基本用法,但是不太实用会改动一下
<keep-alive>
    <!-- 需要缓存的视图组件 -->
  <router-view v-if="$route.meta.keepAlive">
  </router-view>
</keep-alive>

<!-- 不需要缓存的视图组件 -->
<router-view v-if="!$route.meta.keepAlive">
</router-view>

//业务场景的用法
export default {
      name: "app",
      data: () => ({
        include: []
      }),
      watch: {
        $route(to, from) {
          //如果 要 to(进入) 的页面是需要 keepAlive 缓存的,把 name push 进 include数组
          if (to.meta.keepAlive) {
            !this.include.includes(to.name) && this.include.push(to.name);
          }
          //如果 要 form(离开) 的页面是 keepAlive缓存的,
          //再根据 deepth 来判断是前进还是后退
          //如果是后退
          if (from.meta.keepAlive && to.meta.deepth < from.meta.deepth) {
            var index = this.include.indexOf(from.name);
            index !== -1 && this.include.splice(index, 1);
          }
        }
      }
    };
以上是调整后的
原来是这样:include和exclude指定是否缓存某些组件

<keep-alive :inclued = "about"> 就是组件名字 name:about
实用keep-alive 附带生命周期
created mounted update destroy

初始进入和离开 created ---> mounted ---> activated --> deactivated
后续进入和离开 activated --> deactivated

7.nextTick


vue是异步渲染的

methods:{
console.log(
this.$nextTick(()=>{
	
})
}
<ul ref='xx'>

this.$ref.xx //获取当前Dom节点

//eslint-disable-next-line

8.动态渲染组件

用法:
<component :is = "component-name">

import NextTick from 'xx'
components:{
	NextTcik
}
data(){
	component-name:NextTick
}

动态加载组件

结合v-for
<v-for (val,key) in componentList :key="key">
	<component :is = "val.type">

data(){
	componentsList = [
		1:{
			type:component-name
		},

	]
}

实用场景,就是更加数据来加载对应类型的组件

例如:一个页面有很多类型的数据,内容,图片,视频等等。
数据是内容文本 = 》TextConponent

9.v-mode自定义

这里就涉及到父子组件
效果跟input双向绑定一样

//父组件

<p> {{name}}<p/>
<About v-model = "name'></About>

improt About from 'xx';

components:{
	About
},
data(){
	return {
			name:'xx'
	}
}

// 子组件

<input type = "text" :value="textInput"
 @input = "$emit('change',event.target.value)">

model:{
	prop:'textInput',
	enent: 'change'
}
props:{
	textInput:String,
	defualt(){
	return ''
}
}

10.兄弟组件之间传值

2.0要引用eventBus.js 事件中心
enventBus.js
import Vue from "vue"
export default new Vue

//x1.vue
improt eventBus from ./enventBue

eventBut.$emit('add',value);

//x2.vue
improt eventBus from ./eventBus.js

eventBus.$on('add',value);

beforeDestroy(){
		eventBus.$off('add',callBack)
}
3.0要使用第三方库
npm install event-emitter

用法同上
事件移除:原生的document.addEventListener,自定义事件就需要手动移除,否则后果很严重,内存泄露(图一)
图一
图一
vue本身的@click等 会在实例销毁时候移除(即是使用vue语法绑定的事件v-on
 
嵌套路由
notion image
在进入首级路由后,
常用:点击当前页面的按钮在页面中显示不同的组件

vue3 课程

生命周期的理解

  • before created 实例创建之前
  • create 实例创建成功
  • before mount 组件内容被渲染到页面之前
  • mount 组件内容被渲染到页面后
  • before update 数据改变就会执行,打印是之前的内容
  • update 是数据改变后,打印是新数据
 

插槽

单个solt
//父组件
<layout>
	<div> 父传子让插槽显示的内容</div>
</layout>

//子组件
<solt> default data</solt>
多个solt 用具名插槽 (场景:方便调整子组件中solt的位置与页面内容的顺序一致)
//父组件
<layout>
	<div v-solt=“header”></div>
	<div v-solt=“footer”></div>
</layout>
//或者用temple语法
<layout>
	<template v-solt:header> </template>
	<template v-solt:footer> </template>
</layout>

//子组件
<solt name="header"></solt>
	<div> content</div>
<solt name="footer"></solt>
 
作用域插槽: 写插件的时候用的比较多
子组件的数据传到父组件中,父可以调用子的数据
//1.父组件 app
<list v-solt = "soltprops">
	<div> {{soltprops.bindattrs}}</div>
</list>
//可以用另外的简写
<list v-solt = "bindattrs">
	<div>{{bindattrs}}</div>
</list>

//2.子组件 list
<solt v-for ="item in list" :bindattrs =“item”/>
 

动态组件

<component :is="组件名"/>
多数会配合切换使用,会用到keep-alive包住
通过声明一个变量保存,利用if else 赋值
场景:输入框内容,切换后还保留
异步组件
vue3.0
vue.defineAsyncComponent(
()=>{}
)

基本语法查漏

多层级传递给子组件数据 但是不是响应式,多层级的数据,不能感知data中的数据变化。
这是,要引用data里面数据的写法
provide,inject
provide(){
return {
count:this.count
}
}
普通情况
provide:{
count:1
}
inject:["count"]类似props的写法
 
 
ref 获取dom节点/组件引用的api
div :ref=“dom”
child :ref=“child”
this.$refs.dom 获取到dom节点
this.$refs.child.handleChick() 这里可以调用child组件中的方法.

插件

vue 渲染的一个过程:template render h 虚拟dom(js对象)真实的dom

render 函数用法

render(){
	const {h} = Vue
	return h ("div",{},'这是内容')
}
**插件场景(数据检验)**

配合mixin
this.$xxx
//父组件
rules:{
	key:{
	validate:key =>key===0
}
vue.mixin(create(){
		获取规则
		this.$options.rules
		监听数据变化
		this.$watch(key,())
	}
})
//封装
const xxx = (app,options)=>{
}
vue.use(xxx)

vue3开发笔记

💯vue3商城开发步骤操作记录