Vue(一)——开发基础
什么是Vue
Vue是一款用于构建用户界面的渐进式框架。
- 其中,”渐进式”是指在使用Vue核心库时,可以在核心库的基础上根据实际需要逐步增加功能。
- 基于MVVM模式的框架。MVVM住要包含:
- Model:数据模型,负责业务数据处理
- View:视图,用户界面,负责视图处理
- ViewModel:视图模型,连接Model和View,负责监听Model或者View的变化。工作原理:
DOM Listeners
监听DOM变化自动同步Model,Data Bindings
监听数据变化自动更新View。
- 特性:
- 数据驱动的视图:Vue监听数据变化。当页面数据发生变化时,Vue会自动重新渲染页面结构。
- 双向数据绑定:数据变化会影响视图,视图变化也会影响数据。
- 指令:Vue提供了一些指令,用于操作DOM。
- 插件:Vue Router、Vuex、Pinia等。
- Vue3的新特性
- 体积更小:采取按需编译
- 性能提升
- 更好的TypeScript支持
- 暴露更底层API
- 更先进组件
- 提供组合式API
Vue开发环境
Node.js
Node.js是一个基于V8引擎的JavaScript运行环境,提供了一些功能性的API
包管理工具
npm是node.js默认的包管理工具
1 | npm install bootstrap |
yarn是Facebook开发的包管理工具
1 | yarn add bootstrap |
-g:全局安装
npm和yarn的区别:
- 使用npm安装同一个包时,每次安装都需要重新下载,而yarn会缓存每个下载过的包,再次使用时无需重复下载
- npm按照队列安装每个包,而yarn会并行安装
- npm输出信息冗长,yarn输出信息更简洁,只输出必要的信息
Vite与Webpack
Vite是一个轻量级、运行速度快的前端构建工具,支持模块热替换(HMR)
模块热替换可以及时准确的更新模块,当代码修改时无需重新加载页面或清除应用程序状态。
在Vue3出现前,Vue2一般使用Vue CLI创建。Vue CLI基于Webpack构建并配置项目。在项目启动时,Webpack需要从入口文件索引整个项目的文件,编译成一个或多个单独的.js文件。
虽然Webpack对代码进行了拆分,但是仍可能一次生成所有路由下的编译后的文件,导致项目启动慢。
而Vite在项目启动时,会对模块代码进行按需加载,启动速度快
- 手动创建项目
1
2npm create vite@latest
yarn create vite - 通过模板自动创建项目
1
2npm create vite@latest my-vue-app -- --template vue
yarn create vite my-vue-app --template vue
目录结构与运行过程
- node_modules:存放项目依赖和安装的插件
- public:存放不可编译的静态资源文件,项目构建时会原封不动的复制到dist目录下,用绝对路径访问
- src:存放项目源码
- src\assets:存放可编译的静态资源文件,如图片、样式文件等,用相对路径访问
- src\components:存放单文件组件,如.vue文件
- src\App.vue:根组件
- src\main.js:入口文件,创建Vue应用实例
- src\style.css:全局样式文件
- .gitignore:git忽略文件
- index.html:页面入口文件,默认的主渲染页面文件
- package.json:项目配置文件
- README.md:项目说明文件
- vite.config.js:Vite配置文件
- yarn.lock:yarn包管理文件
启动服务时,项目会通过src\main.js文件创建Vue应用实例,然后将App.vue组件渲染到index.html文件的指定区域。
Vue.js开发基础
单文件组件
每个单文件组件都包含三个部分:
- 模板:搭建当前组件DOM结构,
<template></template>
标签包裹,容器标签,不会渲染为真正的DOM元素 - 样式:设置当前组件的样式,
<style></style>
标签包裹。 - 逻辑:通过Js代码处理组件的数据与业务逻辑,
<script></script>
标签包裹。
数据绑定
- Mustache语法:
{{}}
,用于绑定数据到视图 - 响应式数据绑定:Vue会监听数据的变化,当数据发生变化时,Vue会自动更新视图
- ref():将数据转换为响应式数据
- reactive():创建响应式对象或数组
- toRef():将响应式对象中某个属性转换为响应式数据,响应式数据 = toRef(响应式对象, ‘属性名’)
- toRefs():将响应式对象中所有属性转换为响应式数据。 所有属性组成的对象 = toRefs(响应式对象)
指令
内容渲染指令v-text、v-html
v-text:替换元素的textContent,不会解析html标签, v-html:替换元素的innerHTML,会解析html标签1
2<div v-text="msg"></div>
<div v-html="msg"></div>属性绑定指令v-bind
v-bind:动态绑定元素属性,简写为:
,v-bind:属性名=”表达式”1
2<img v-bind:src="imgUrl" alt="图片">
<img :src="imgUrl" alt="图片">事件绑定指令v-on
v-on:绑定事件监听器,简写为@
,v-on:事件名=”事件处理函数”1
2<button v-on:click="handleClick">点击</button>
<button @click="handleClick">点击</button>双向数据绑定指令v-model
v-model:实现表单元素和数据的双向绑定,比如处理表单时,输入框与变量保持同步内部为不同元素绑定不同的属性和事件,如input元素绑定value属性和input事件,checkbox元素绑定checked属性和change事件等。
3个修饰符:.number(将输入值转换为数字类型)、.trim(去除输入值两侧空格)、.lazy(将输入值转换为change事件触发)
1
2<input v-model="msg" type="text">
<input v-model.number="num" type="number">条件渲染指令v-if、v-else、v-else-if、v-show
v-if:根据表达式的值,动态添加或删除元素,v-else:与v-if连用,表示v-if的反向条件,v-else-if:与v-if连用,表示v-if的另一条件1
2<div v-if="isShow">显示</div>
<div v-else>隐藏</div>v-show:根据表达式的值,动态显示或隐藏元素,v-show=”表达式”
1
<div v-show="isShow">显示</div>
二者的区别是v-if是真正的条件渲染,v-show是通过display属性控制元素的显示与隐藏
列表渲染指令v-for
v-for:根据数据生成列表,v-for=”item in items”,v-for=”(item, index) in items”key:为每个节点设置唯一标识,提高性能,如果list数组中删除一个元素后,index发生变化,Vue会重新渲染整个列表,而key可以保证每个元素的唯一性,以便它能跟踪每个节点的身份,从而对现有元素进行重用和重新排序。
根据一维数组渲染列表
1
<li v-for="(item,index) in items" :key="index">{{item.name}}</li>
根据对象数组渲染列表
1
<li v-for="item in items" :key="item.id">{{item.name}}</li>
根据对象渲染列表(第一个参数是值,第二个参数是键)
1
<li v-for="(value,key) in obj" :key="key">{{key}}:{{value}}</li>
事件对象
事件对象是事件触发时产生的对象,保存了事件触发时的相关信息,例如事件类型,事件发生的时间戳,事件被触发时对应标签的一些属性值集合等。
- 通过事件方法等参数获取事件对象
1
2
3
4
5
6
7
8<template>
<button @click="handleClick">点击</button>
</template>
<script setup>
const handleClick = (e) => {
console.log(e)
}
</script> - 通过$event获取事件对象```
1
2
3
4
5
6
7
8
9<template>
<button @click="handleClick($event)">点击</button>
</template>
<script setup>
const handleClick = (e) => {
console.log(e)
}
</script>
事件修饰符
- .prevent:阻止默认行为
- .stop:阻止事件冒泡
- .capture:事件捕获
- .once:只触发一次
- .self:只有事件在该元素本身触发时才会触发
- .passive:滚动事件的默认行为,滑动滚动条立即发生,无需等待onScroll方法执行完毕。
- .enter、.tab、.delete、.esc、.space、.up、.down:键盘事件修饰符
- .left、.right、.middle: 鼠标事件修饰符
计算属性
计算属性监听数据变化,将计算结果缓存起来,只有计算属性中依赖的数据源变化了,计算属性才会自动重新求值,并重新加入缓存
1 | <template> |
侦听器watch(数据来源,回调函数,可选参数)
侦听器监听数据状态,数据更新后进行相应的操作
1 | <template> |
数据来源可以是一个有返回值的函数,一个响应式数据, 一个响应式对象,或者一个由以上类型的值组成的数组。
回调函数中有两个参数,第一个参数是新值,第二个参数是旧值。
可选参数是一个对象,有两个常用选项:deep和immediate。deep用于监听对象内部属性的变化,immediate用于在侦听器初次加载时立即执行回调函数。
样式绑定
绑定class属性
- 字符串:
<div :class="className"></div>
- 对象:
<div :class="{className: isActive}"></div>
- 数组:
<div :class="[className1, className2]"></div>
可以使用三元表达式来切换,比如
<div :class="{isActive ? 'active' : 'inactive'}"></div>
- 字符串:
绑定style属性
- 对象:
<div :style="{color: 'red', fontSize: '16px'}"></div>
- 数组:
<div :style="[style1, style2]"></div>
CSS中的属性名使用驼峰命名法,如
backgroundColor
或者短横线分隔命名法,如background-color
,如果是第二种需要将属性写成字符串形式。- 对象: