代码

简介

vue 是前端优秀框架,是一套用于构建用户界面的渐进式框架

特点

  • 简单
  • 易学

安装使用

使用命令行安装

vue cli 是一个基于 vue.js 进行快速开发的完整系统

1
npm install -g @vue/cli

测试,在终端输入以下指令测试是否安装成功

1
vue --version

一些功能

使用下列指令打开一个 gui 界面来引导项目创建等一系列操作

1
vue ui

创建项目

在终端使用下列指令创建一个项目

1
vue create projectname

输入之后需要使用上下按键来选择默认项目模板

可以选择手动选择,然后按照如下选择

config

文件目录说明

目录/文件 说明
build 项目构建(webpack)相关代码
config 配置目录,包括端口号等。初学可以使用默认的。
node_modules npm 加载的项目依赖模块
src 这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件:
assets 放置一些图片,如 logo 等,还可以放全局使用的 css 文件
components 目录里面放了一个组件文件,可以不用。
App.vue 项目入口文件,我们也可以直接将组件写这里,而不使用 components 目录。
main.js 项目的核心文件。
index.css 样式文件。
static 静态资源目录,如图片、字体等。
public 公共资源目录。
test 初始测试目录,可删除
.xxxx文件 这些是一些配置文件,包括语法配置,git配置等。
index.html 首页入口文件,你可以添加一些 meta 信息或统计代码啥的。
package.json 项目配置文件。
README.md 项目的说明文档,markdown 格式
dist 使用 npm run build 命令打包后会生成该目录。

基础语法

文本

数据绑定常见的形式就是使用 Mustache 双大括号的语法文本插值

1
<span>Message: {{msg}}</span>

一般配合 js 中的 data() 设置数据

1
2
3
4
5
6
7
8
export default {
name: '1',
data() {
return {
msg: "msg"
}
}
}

原始HTML

双大括号会将数据解释为普通文本,而非 html 代码,为了输出 html 就需要使用 v-html 指令

attribute属性

Mustache 语法不能再 html 属性中使用,但是可以使用 v-bind 指令。 classstylehtml 元素的属性,用于设置元素的样式,我们可以用 v-bind 来设置样式属性。有两种写法,如下

1
2
<div v-bind:id="dynamicId">v-bind:</div>
<div :id="dynamicId">v-bind:</div>

内联样式

1
2
3
4
<div id="app">
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }">1</div>
</div>
<!--其中 activeColor:"red", fontSize: 20-->

上述会被渲染为

1
<div :style="{ color: red, fontSize: 20px}">1</div>

内联样式还可指定多重值,提供一个包含多个值的数组,常用于提供多个带前缀的值,这样写只会渲染数组中最后一个被浏览器支持的值

1
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>

组件上使用class属性

当你在带有单个根元素的自定义组件上使用 class 属性时,这些 class 将被添加到该元素中。此元素上的现有 class 将不会被覆盖

1
2
3
4
5
6
7
8
9
10
<template>
<newComponentName class="classC classD"></newComponentName>
</template>

<script>
var app = Vue.createApp({})
app.component('newComponentName', {
template: '<h1 class="classA classB">这是一个新组件标题</h1>'
})
</script>

最终渲染结果为

1
<h1 class="classA classB classC classD">这是一个新组件标题</h1>

对于带数据绑定的 class 也可使用

1
<newComponentName :class="{ active: isActive }"></newComponentName>

isActivetrue 时,最终渲染效果为

1
<h1 class="classA classB active">这是一个新组件标题</h1>

如果新的组件有多个根元素,需要定义哪些部分将接收这个类。可以使用 $attrs 组件属性执行此操作,可以用于传递组件属性和事件。下列的操作实际上就是继承原来的类属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="app">
<newComponentName class="classA"></newComponentName>
</div>

<script>
const app = Vue.createApp({})
app.component('newComponentName', {
template: `
<p :class="$attrs.class">这是一个段落</p>
<span>这是一个子组件</span>
`
})
app.mount('#app')
</script>

最终渲染结果为

1
2
3
4
<div id="app">
<p :class="classA">这是一个段落</p>
<span>这是一个子组件</span>
</div>

使用Js表达式

vue.js 提供了完全的 js 表达式支持,使用双括号来表示使其被解析为 js 表达式。但是,双括号中只能包含单个表达式

1
2
3
4
5
6
7
// 有效
{{number + 1}}
{{ok? 'y' : 'n'}}

// 无效
{{var a = 1}} //语句
{{if(ok) {return msg;}}} // 流程控制语句也不会生效

条件渲染

  • v-if 用于条件性的渲染一块内容,这块内容只会在指令的表达式返回 true 时渲染
    • 真正的条件渲染,会保证在切换过程中,条件块内的事件监听器和子组件适当的被销毁和重建
    • 也是惰性的,如果在初始渲染时条件为假,那什么也不做,直到变为真才会做渲染
  • v-else 用于作为 v-ifelse
  • v-show 用于条件性展示元素的另一个选项
    • 不管初始条件是什么都会渲染元素,并且只是简单的基于 css 进行切换
    • 一般来说 v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销,所以如果需要非常频繁的切换则使用 v-show ,如果在运行中很少改变就使用 v-if

列表渲染

  • v-for 把一个数组映射为一组元素,基于一个数组来渲染一个列表,指令需要使用 item in items 语法来实现
  • vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略,如果数据项的顺序被改变,vue 将不会移动 dom 元素来匹配数据项的顺序,而是就地更新每个元素,并且保证它们在每个索引位置正确渲染。为了给 vue 一个提示,以便它能够跟踪每个节点,从而重新排列现有元素,需要为每一项提供一个唯一的 key attribute

事件处理

  • 监听事件,可以使用 v-on 指令(可缩写为 @ 符号)来监听 dom 事件,并且在触发事件时执行一些 js 指令
  • 事件处理方法,很多事件处理逻辑会比较复杂,所以可以写为一个调用的方法名称
  • 内联处理器中的方法,也可以称作事件传递函数

表单输入绑定

  • v-model 指令在表单 <input><textarea> 以及 <select> 元素上创建双向数据绑定,它会根据空间类型自动选取正确的方法来更新元素。本质上不过是语法糖,负责监听用户输入事件来更新数据,并且完成一些特殊处理
  • .lazy 修饰符, v-model 事件在每次 input 事件触发之后就进行数据同步,可以添加该修饰符,从而转为 change 事件之后进行同步
  • .trim 修饰符,可以自动过滤用户输入的首尾空白字符

组件基础

  • 单文件组件,单文件组件是一种特殊的文件格式,允许将 vue 组件中的模板,逻辑与样式封装在单个文件中
  • 加载组件步骤
    • 引入组件 import mycomponent from './components/mycomponent.vue'; './components/mycomponent'
    • 挂载组件 components: {mycomponent}
    • 显示组件 <mycomponent/>
  • 组件组织,通常一个应用会以一棵嵌套的组件树的形式来组织
    conponent_tree

props组件交互

组件与组件之间是需要存在交互的,否则完全没关系,组件的意义就很小了,而 props 是可以在组件上注册的一些自定义 attribute ,传递的方向就是父组件传递到子组件

props 传递的参数是没有类型限制的,但是传入数据为数组或者对象类型时,默认值时需要返回工厂模式,也就是定义一个返回一个空数组的函数

使用方法

  1. 在调用组件的文件中声明需要传递的变量,写法与组件文件中一致

    1
    2
    3
    4
    5
    6
    data() {
    return {
    title: "一个标题",
    age : 10,
    }
    }

    需要在加载组件时传入参数

    1
    <props_test :title="title" :age="age"/>
  2. 在组件中需要使用 props 声明变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <script>
    export default {
    name: "props_test",
    props: {
    title: {
    type:String,
    default:""
    },
    age: {
    type: Number,
    default:0
    }
    }
    }
    </script>

自定义事件组件交互

自定义事件可以在组件中反向传递数据, prop 可以将数据从父组件传递到子数组,对于反向操作,可以使用自定义事件实现

  • 使用 this.$emit() 函数,其中第一个参数是字符串,理论上是随便的,但是需要与弗组件中对应,第二个参数就是传递的数据

使用

  1. 首先在子组件中做定义一个按钮或者触发这个事件的元素

    1
    <button @click="sendHandle">sendData</button>

    并且定义函数 sendHandle

    1
    2
    3
    sendHandle() {
    this.$emit("onEvent", "data");
    }
  2. 在父组件中加载该组件时,需要做如下的定义

    1
    <props_test @onEvent="getDataHandle"/>

    需要注意,这里的 onEvent 与第一步中的 $emit() 的第一个参数是对应的,需要一致。然后自定义收到消息的回调函数,这里的 data 就是上述 $emit() 函数的第二个参数

    1
    2
    3
    getDataHandle(data) {
    console.log(data);
    }

组件的生命周期

每个组件在被创建时都要经过一系列初始化的过程,例如设置数据监听,编译模板,实例挂载到 dom 上等,这个过程会运行一些叫做生命周期钩子的函数,给了用户在不同阶段添加代码的功能

可以直接定义下面的函数,来实现在不同的阶段添加用户代码的功能

  • 创建时 beforeCreate created
  • 渲染时 beforeMount mounted
  • 更新时 beforeUpdate updated
  • 卸载时 beforeUnmount unmounted