vue2.0基础

news2024/12/23 14:21:05

文章目录

    • VUE
    • Vue2.0
        • vue特点
        • 事件处理
        • 键盘事件
        • 计算属性
        • 监听watch
        • 深度监视
        • 绑定class样式
        • 条件渲染
        • 列表渲染
        • 列表过滤
        • 列表排序
        • Vue.set()的使用
        • Vue检测数组的原理
        • Vue监测原理总结
        • 指令
        • 生命周期
        • Vue component
        • Vue配置文件vue.config.JS
        • 其他:
        • 组件自定义事件
        • 组件自定义事件解绑
        • 全局事件总线
        • $nextTick
        • 动画效果
        • 配置代理
        • vue-resource
        • 插槽
        • Vuex
        • mapState与mapGetters
        • 路由
          • 路由理解
          • 多级路由(嵌套路由)
          • 路由传参
          • 命名路由
          • 路由params参数
          • 路由props配置
          • 路由router-link的replace属性
          • 编程式路由导航
          • 缓存路由组件
          • 全局路由守卫
          • 独享路由守卫
          • 组件内路由守卫
          • 路由两种工作模式history和hash模式

VUE

Vue2.0

vue特点

  • 组件化模式
  • 声明式编码
<ul>
	<li v-for=""p in persons>
		{{p.id}}-{{p.name}}-{{p.age}}
	</li>
<ul>
  • 使用虚拟dom+diff算法,尽量复用dom节点

事件处理

//示例:
<span @click="smileFnc($event,1000)">000</span>

methods:{
  smileFnc(e,val){
    console.log(e)
    console.log(val)
  }
}

//总结:
v-bind => :
v-model => v-model:value => v-model
v-on:click => @click
事件修饰符

$event接收默认事件对象

@click.prevent 阻止默认事件
@click.stop 阻止冒泡
@click.once 事件只触发一次
@click.capture 事件捕获模式,事件捕获阶段就进行处理
@click.self 只有event.target是当前操作元素才触发
@click.passive 事件的默认行为会立即执行,不用等事件回调执行完毕(@wheel等事先执行函数然后执行像是滚动条滚动等页面滚动渲染)

//别名可以连着写 @click.stop.prevent

@scroll 滚动条滚动事件
@wheel 滚轮滚动事件

键盘事件

@keydown
@keyup

//获取键盘值
event.keyCode

//按键别名
@keyup.enter
@keyup.esc

//如果绑定的事件按键没有在常用的里面
获取event.key即这个key的名字,直接@keyup.caps-lock;Capslock要分开加-

tab特殊必须配合keydown使用,因为它有让光标移走的特性

也可以用编码,但是不同键盘编码不一样

@keyup.ctrl.y 需要ctrl

请添加图片描述
定义别名按键请添加图片描述

计算属性

  • 初次读取值的时候get会被调用
  • 所依赖的数据发生变化的时候会重新调用
computed:{
  fullname:{
  	//当有人调用fullname get就会被调用;computed中的值调用;多次调用执行的时候会被缓存
    get(){
      return this.firstname+'-'+this.lastname
    },
    set(value){	//当fullname被修改时候回调用;并且要修改计算时引起变化的依赖数据的值
      const arr = value.split('-')
      this.firstname = arr[0]
      this.lastname = arr[1]
    }
  }
}

//computed计算属性的 简洁写法,这种写法只限只有get
computed:{
  fullname:function(){		//这个函数当作get函数使用 fullname(){}
    return firstname+'-'+lastname
  }
}

⚠️注意:methods中的数据没有缓存,当模板语法中多次使用回多次调用方法;

⚠️注意:可以方法直接写在@click的计算语句中,不写在method中,但是这样一般只写一些简单的语法;并且
@click这个里面的只能写vm上面挂的一些方法数据等,比如像是alert这些语法是没有的会报错
请添加图片描述

监听watch

  • watch可以监听data中以及computed中的属性值
  • 只有属性存在的时候才能监听
  • 当监视属性发生变化时候,监听的毁掉函数handler自动执行
  • 监听的两种写法watch和Vue的实例vm.$watch
watch:{
  ishot:{		//其实是'ishot'的简写
    //handler是ishot被修改的时候执行
    handler(newValue,oldValue){
      
    },
    //immediate默认值是false,立即执行;immediate设置为true是初始化时候让handler调用一下
    immediate:true
  }
}

//也可以用vm.$watch进行监视
vm.$watch('ishot',{
    handler(newValue,oldValue){
    },
    immediate:true
  })

深度监视

//监视多个结构中某个属性的变化
const vm = new Vue({
  data:{
    ishot:true,
    number:{
      a:1,
      b:2
    }
  },
  watch:{
  	//方式一:不推荐
    'number.a':{
      handler(){
        console.log('检测a的变化')
      }
    },
    //方式二
    //deep:true开启深度监视,也就是当number中的a b任何一个变化都会触发handler;之前是不会如果地址没变
    //vue是可以监视到多层级数据改变的但是watch默认没有开启多层级监听
    number:{
      deep:true,	
      handler(){
        
      }
    }
    
  }
})

//监视简写
const vm = new Vue({
  data:{
    ishot:true,
    number:{
      a:1,
      b:2
    }
  },
  watch:{
  //当配置项只有handler的时候可以开启简写
    number(newValue,oldValue){	//相当于handler函数
      
    }
})

//vm.$watch监视简写
vm.$watch('ishot',function(newValue,oldValue){
  //这里不允许使用肩头函数,会有this指向问题
})

注意:计算属性computed中不能开启异步任务去获取返回值;watch监视器的可以开启异步任务

总结:

  • computed能完成的watch一定能完成
  • watch能完成的computed不一定能完成,比如ajax毁掉函数、promise回调函数、setTimeout,computed中不可以做异步操作
  • 注意:
    • 所有被vue管理的函数最好都写成普通函数,这样吧this指向才不会出问题
    • 所有不被vue管理的函数最好都写成街头函数(比如setTimeout、异步函数),这样this的指向才是vm或者组件的实例对象

绑定class样式

<style>
	.basic{
    
	}
	.normal{}
	.normalT{}
	.style1{}
	.style2{}
	.style3{}
</style>
//1、字符串:动态绑定适用于类名不确定需要指定
<div :class="mood" @click="changeMood">smileyqp</div>
//2、数组:要绑定样式的个数,名字都不确定
<div :class="styleArr" @click="changeStyle" @click="changeStyle">smileyqp</div>
//3、对象:适用于要绑定样式的个数确定但是是否使用可以动态改变
<div :class="styleObj" @click="styleArr" @click="changeStyle">smileyqp</div>
//4、直接内联:
<div :style="{fontSize:fsize+'px'}" @click="styleArr" @click="changeStyle">smileyqp</div>
<div :style="stObj" @click="styleArr" @click="changeStyle">smileyqp</div>
//5、style数组写法
<div :style="stArr" @click="styleArr" @click="changeStyle">smileyqp</div>

const vm = new Vue({
  data:{
    mood:'normal',
    styleArr:['style1','style2','style3'],
    styleObj:{
      style1:false,
      style2:true,
      style3:false,
      fsize:40
    },
    stObj:{
      fontSize:'30px',
      color:'red',
    }
    stObj2:{
      background:'blue'
    },
    stArr:[stObj,stObj2]
  },
  methods:{
    changeMood(){
      this.mood = 'normalT'
    },
    changeStyle(){
      this.styleArr.shift();
    },
    changStyObj(){
      this.styleObj.style1 = true
    }
  }
})

条件渲染

//v-show实际上是操作display
//1、使用v-show
<div v-show="isShow" @click="fn">smileyqp</div>

<div v-show="n===1" @click="fn">smileyqp</div>
<div v-show="n===2" @click="fn">smileyqp</div>
<div v-show="n===3" @click="fn">smileyqp</div>

//2、使用v-if;直接是节点操作
<div v-if="isShow" @click="fn">smileyqp</div>

//这种不允许打断 ;也可以直接全用v-if
<div v-if="n===1" @click="fn">smileyqp</div>
<div v-else-if="n===2" @click="fn">smileyqp</div> //	如果成立直接不看下面条件
<div v-else-if="n===3" @click="fn">smileyqp</div>
<div v-else @click="fn">smileyqp</div>	//v-else

//注意:可以使用v-if与template的配合使用;template不能跟与v-show一起使用
//使用template,渲染的时候不会新增没有用的节点
<template v-if="n===1">
	<h2>hello</h2>
	<h2>smileyqp</h2>
	<h2>yqp</h2>
</template>

const vm = new Vue({
  data:{
    isShow:false,
    n:1
  }
})

如果有很高的切换频率使用v-show,因为v-show只是动态控制节点显示,v-if会去切换节点

列表渲染

<div v-if="n===1">
	<ul>
		<li v-for="p in persons" :key="p.id">{{p.name}}-{{p.age}}</p>
	</ul>
	//1、遍历
	<ul>
		<li v-for="(item,index) in persons" :key="index">{{p.name}}-{{p.age}}</p>	
	</ul>
	//2、也可以不用括号
	<ul>
		<li v-for="item,index in persons" :key="index">{{p.name}}-{{p.age}}</p>
	</ul>
	//3、in也可以改成of
	<ul>
		<li v-for="(item,index) of persons" :key="index">{{p.name}}-{{p.age}}</p>
	</ul>
	//4、也可以遍历object
	<ul>
		<li v-for="(value,key) of cars" :key="key">{{key}}:{{value}}</p>
	</ul>
	//5、也可以遍历字符串;s是字符串的每一个字符
	<ul>
		<li v-for="(s,index) of str" :key="index">{{index}}:{{s}}</p>
	</ul>
	//7、遍历指定次数;如下遍历五次,a是从1开始计数,b是index
	<ul>
		<li v-for="(a,b) of 5" :key="b">{{a}}:{{b}}</p>
	</ul>
</div>

const vm = new Vue({
  data:{
    persons:[
      {id:001,name:'smile1',age:12},
      {id:002,name:'smile2',age:14},
      {id:003,name:'smile3',age:16},
    ],
    cars:{
      name:'car1',
      price:12222,
      color:'yellow'
    },
    str:'smileyqp'
  }
})

列表过滤

<div v-if="n===1">
	<ul>
		<li v-for="p in filterPersons" :key="p.id">{{p.name}}-{{p.age}}</p>
	</ul>
	<input v-model="keyword"/>
</div>

//1、用watch实现过滤
const vm = new Vue({
  data:{
  	keyword:'',
    persons:[
      {id:001,name:'smile1',age:12},
      {id:002,name:'smile2',age:14},
      {id:003,name:'smile3',age:16},
    ],
    filterPersons:[]
  },
  watch:{
    keyword:{
    	//控制一开始就调用一次,最开始为空,是会调用的,空字符串indexOf返回0,也就是返回persons数组
    	immediate:true,	
      handler(newVal){
      this.filterPersons = return this.persons.filter(p=>{
        return p.name.indexOf(newVal) !== -1
      })
    }
    }
  }
})

//2、用computed实现
const vm = new Vue({
  data:{
  	keyword:'',
    persons:[
      {id:001,name:'smile1',age:12},
      {id:002,name:'smile2',age:14},
      {id:003,name:'smile3',age:16},
    ]
  },
  computed:{
  	 filterPersons(){
       	return this.persons.filter(p=>{
        	return p.name.indexOf(keyword) !== -1
      	})
  	 }
  }
  }
})

列表排序

<div v-if="n===1">
	<ul>
		<li v-for="p in filterPersons" :key="p.id">{{p.name}}-{{p.age}}</p>
	</ul>
	<input v-model="keyword"/>
	<button @click="sortType = 0">default</button>
  <button @click="sortType = 1">default</button>
  <button @click="sortType = 2">default</button>
</div>

//1、用watch实现过滤
const vm = new Vue({
  data:{
  	sortType:0,	//0原顺序 1升序 2降序
    persons:[
      {id:001,name:'smile1',age:12},
      {id:002,name:'smile2',age:14},
      {id:003,name:'smile3',age:16},
    ],
    filterPersons:[]
  },
  computed:{
    filterPersons(){
      const arr = this.persons.filter(p=>p.name.indexOf(keyword) !== -1)
      if(this.sortType){
        return this.arr.sort((a,b)=>{
          return this.sortType === 1?a-b:b-a
        })
      }
      return arr;
    }
  }
})

请添加图片描述

Vue.set()的使用

  • 局限性:只能给data中的某一个对象添加属性,并不能新增data下面的属性

Vue.set(target,key,val)

const vm = new Vue({
  data:{
    persons:[
      {id:001,name:'smile1',age:12},
      {id:002,name:'smile2',age:14},
      {id:003,name:'smile3',age:16},
    ],
   	perObj:{id:1212,name:'smile1',age:12}
  },
  methods:{
    add(){
    	//Vue.set(this.perObj,'sex','male')
    	//第一个target参数不能是vm也不能是vm下面的第一个对象
    	this.$set(this.perObj,'sex','male')
    }
  }
})

Vue检测数组的原理

  • 注意数组修改的时候要使用左边七个方法,才会更新页面;类似filter以及直接修改index赋值这些不能检测到数组变化,不会去修改页面
  • vue中的数组不是靠setter和getter去实现的,因此要实际修改数组的方法才行
  • 注意:Vue是对数组的push这些方法进行了包装,所以能监听到这些;Vue中的push调用原来Array的push并且多做了一件解析模板的事情,所以能引起页面变化

请添加图片描述

  • 备注:另外也可以直接$set方法去实现,但是没有必要

Vue监测原理总结

请添加图片描述
补充:Vue中数组项变化可以监听到方式请添加图片描述

收集表单数据
请添加图片描述
过滤器请添加图片描述
示例:
请添加图片描述

指令

请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

生命周期

请添加图片描述
请添加图片描述

Vue component

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述请添加图片描述

Vue配置文件vue.config.JS

请添加图片描述
请添加图片描述

其他:

请添加图片描述

组件自定义事件

通过父组件给子组件绑定一个自定义事件实现父给子传递数据

  • 形式
    • 父组件
<Student v-on:componentName="funcName"></Student>
//简写形式: @componentName="funcName"
//方法只执行一次   @componentName.once="funcName"
...


funcName(name){
	console.log(name)
}

  • 父组件接收另外一种形式
    • 这种方式灵活性强
    • 只执行一次的写法this.$refs.student.$once('smileyqp',this.getStudent)

  • 子组件
<button @click="clickFunc">click me</button>

...
clickFunc(){
	this.$emit('componentName',this.name)	//
}

在这里插入图片描述

组件自定义事件解绑

  • 解绑耽搁事件:在子组件上写this.$off('funcName')
  • 解绑多个事件

    ⚠️当子组件销毁,绑定在子组件上的所有的自定义事件也是会失效的。

    ⚠️注意:这个地方的this.getStudentName如果是function(){},注意function函数里面的this只想的是子组件的vc,并不是this.getStudentName中的父组件vc,拿不到父组件的属性值除非用箭头函数;

    ⚠️组件调用原生事件:是把这个click给到子组件的最外层元素

    总结:
    在这里插入图片描述

全局事件总线

  • 总结:
    在这里插入图片描述
  • 使用
    在这里插入图片描述
  • 注册:
  • 消息订阅与发布库:pubsub-js
    • 总结

    • 使用
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

$nextTick

$nextTick指定的回调会在dom节点更新完毕之后再执行
在这里插入图片描述

在这里插入图片描述

动画效果

  • 总结:

配置代理

在这里插入图片描述

在这里插入图片描述

vue-resource

  • vue插件库Vue.use(xxx)vue-resource是对xhr的封装
  • 使用方式跟axios一模一样

插槽

  • 插槽分类
    • 默认插槽
    • 具名插槽
    • 作用域插槽

      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

Vuex

  • 原理

  • 环境搭建
    在这里插入图片描述
  • 基本使用
    在这里插入图片描述
  • vuex的getters
    在这里插入图片描述

通过this.$store.getters使用

mapState与mapGetters

路由

路由理解


在这里插入图片描述

在这里插入图片描述

多级路由(嵌套路由)

在这里插入图片描述

路由传参

命名路由


路由params参数


路由props配置

路由router-link的replace属性

在这里插入图片描述

编程式路由导航

在这里插入图片描述

缓存路由组件

在这里插入图片描述

全局路由守卫

主要进行权限控制等
在这里插入图片描述

  • 前置路由守卫
独享路由守卫

只有前置没有后置;写进router配置中
在这里插入图片描述
在这里插入图片描述

组件内路由守卫

写进组件中

在这里插入图片描述

路由两种工作模式history和hash模式

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/609653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql数据库从0到1】-入门基础篇--用户与权限管理

【Mysql数据库从0到1】-入门基础篇--用户与权限管理 &#x1f53b;一、Mysql 用户管理1.1 &#x1f343; Mysql服务器登录1.2 &#x1f343; 用户创建1.3 &#x1f343; 用户修改1.4 &#x1f343; 用户删除1.5 &#x1f343; 用户密码修改1.6 &#x1f343; 用户密码管理 &…

深入浅出C语言—【函数】上

目录 1.函数的概念 2.C语言函数的分类 2.1 库函数 2.1.1 strcpy库函数举例学习方式 2.1.2 库函数扩展知识 2.2 自定义函数 2.2.1求两个整数中的较大值 3. 函数的参数 3.1 实际参数&#xff08;实参&#xff09; 3.2 形式参数&#xff08;形参&#xff09; 4. 函数的…

Linux安全之账户安全

账户安全 Linux用户账户概述&#xff1a; 用户账号 超级用户root系统用户普通用户组账号 基本组&#xff08;私有组----每一个私有组里面只有一个用户&#xff09;附加组&#xff08;公共组----每一个用户都可以加入到这个组里面&#xff09; UID和GID&#xff1a; UID&…

【minio】Ubuntu安装MinIO文件服务器并通过C++上传下载

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍MinIO的使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

pandas速学-DataFrame

一、理解DataFrame 他是一个表格结构&#xff1a;DataFrame 是一个表格型的数据结构 他是有序的&#xff0c;不同值类型&#xff1a;它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。 他可以被看做一个由series组成的…

chatgpt赋能python:PythonIP匹配

Python IP匹配 随着互联网的不断发展&#xff0c;IP地址已成为人们最常使用的一种网络标识。在网络分析和开发中&#xff0c;经常会用到IP地址的相关操作&#xff0c;如IP地址的匹配。Python作为一种性能比较好的语言&#xff0c;也可以很好地完成IP地址的匹配工作。本文将介绍…

【学习日记2023.6.4】之 Linux入门

1. Linux简介 1.1 主流操作系统 不同领域的主流操作系统&#xff0c;主要分为以下这么几类&#xff1a; 桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。接下来&#xff0c;这几个领域中&#xff0c;代表性的操作系统是那些? 1). 桌面操作系统 操作系统特…

数据链路层:虚拟局域网(VLAN)

数据链路层&#xff1a;虚拟局域网&#xff08;VLAN&#xff09; 笔记来源&#xff1a; 湖科大教书匠&#xff1a;虚拟局域网&#xff08;VLAN&#xff09;概述 湖科大教书匠&#xff1a;虚拟局域网&#xff08;VLAN&#xff09;实现机制 声明&#xff1a;该学习笔记来自湖科大…

mybatis源码学习之mybatis执行流程分析

Mybatis执行流程分析 mybatis全局配置文件 mybatis全局配置文件中涉及的标签如下图所示 配置文件解析 public static void main(String[] args) throws IOException {// 读取配置文件InputStream is Resources.getResourceAsStream("org/apache/ibatis/builder/Mappe…

K8S部署Hadoop集群(七)

Hadoop是Apache软件基金会下一个开源分布式计算平台&#xff0c;以HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce&#xff08;Hadoop2.0加入了YARN&#xff0c;Yarn是资源调度框架&#xff0c;能够细粒度的管理和调度任务&#xff0c;还能够支持其他…

UnityVR--EventManager--事件中心3

前期准备 接上一篇&#xff0c;来实现事件中心的管理&#xff1a;使用定义好的事件中心管理器EventManager&#xff0c;实现鼠标拖拽、角色移动、发射子弹等几个功能。 1. InputSystem的准备&#xff1a;需要设置输入设备并关联事件&#xff0c;比如监听键盘输入"WASD&quo…

自制操作系统第三站

修改haribote.nas&#xff0c;界面显示 ; haribote.nas ; TAB4ORG 0xc200MOV AL, 0x13MOV AH, 0x00INT 0x10fin:HLTJMP fin编译运行

MySQL存储引擎概述

前言&#xff1a;MySQL语句执行流程为&#xff1a;SQL语句→查询缓存→解析器→优化器→执行器&#xff08;执行器会调用执行引擎API&#xff09;&#xff1b;人们把“连接管理、查询缓存、语法解析、查询优化”这些并不涉及真实数据存储的功能划分为MySQL server的功能&#x…

TiDB亿级数据亚秒响应查询整体架构

目录 1 TiDB的优势2 TiDB的组件2.1 TiDB Server2.2 PD (Placement Driver) Server2.3 TiKV Server2.4 TiSpark2.5 TiFlash 3 TiKV整体架构3.1 Region分裂与合并3.2 Region调度3.3 分布式事务 4 高可用架构4.1 TiDB高可用4.2 PD高可用4.3 TiKV高可用 5 应用场景5.1 MySQL分片与合…

在地质区划图上绘制伪震中

import numpy as np import matplotlib.pyplot as plt #matplotlib inline from matplotlib import image from matplotlib import pyplot as plt import cv2 # 解析文件&#xff0c;按空格分割字段&#xff0c;得到一个浮点数字类型的矩阵 def loadDataSet(fileName): dataMa…

chatgpt赋能python:Python办公自动化:优化SEO工作效率的关键

Python办公自动化&#xff1a;优化SEO工作效率的关键 随着互联网的不断发展&#xff0c;SEO已经成为了许多企业在网络中展示自己的必备手段。然而&#xff0c;SEO工作需要大量重复性、繁琐的操作&#xff0c;如关键词排名、竞争对手分析、数据收集等&#xff0c;这些工作占据了…

一文说透ES6中的箭头函数表达式

一 总述 ​箭头函数表达式的语法比函数表达式更简洁&#xff0c;并且没有自己的this&#xff0c;arguments&#xff0c;super或new. target。箭头函数表达式更适用于那些本来需要匿名函数的地方&#xff0c;并且它不能用作构造函数。 二 详细 1 1个或多个参数 (param1, par…

【数据结构每日一题】队列——用栈实现队列

[数据结构习题]队列——用栈实现队列 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】栈和队列 &#x1f449;[王道数据结构]习题导航&#x1f48e;&#xff1a; p a g e 85.3 page85.3 page85.3 本节为栈和队列的综合练习题 题目描述&#xff1a; &#x1f…

【AI绘图】五、stable diffussion模型的介绍与使用

1. 下载模型 主流模型下载网站&#xff1a; 1&#xff09;Hugging face 是一个专注于构建、训练和部署先进开源机器学习模型的网站&#xff1a; https://huggingface.co/ 2&#xff09;Civitai 是一个专为 Stable Diffusion AI 艺术模型设计的网站&#xff1a; https://civi…

Python数据分析script必备知识(四)

Python数据分析script必备知识(四) 1.保留最近N天的日志 1.批量创建多个文件 首先,为演示方便,在指定文件夹目录下用下面代码批量新建多个log文件 """ 批量创建多个文件 """ import os file_path = os.path.join(os.getcwd(),LOG) # 如果不…