当我们学习了解一件事儿或者一样东西的时候总是从问题开始的那么什么是vue?vue是一个JavaScript渐进式框架。什么是渐进式呢?渐进式就是像自助餐一样按需索取。什么是库和框架呢?库是方法的集合,一般是一个js文件,比如jquery,而框架拥有一套自己的规则和语法,比如vue。
@vue/cli脚手架
- 什么是脚手架?
- 脚手架是为了工程顺利实施而搭建的工作平台。
- 要创建一个vue工程项目就得搭建一个vue脚手架
- @vue/cli是Vue官方提供的一个全局模块包(得到vue命令), 此包用于创建脚手架项目
@vue/cli安装
- 全局安装命令
yarn global add @vue/cli
# OR
npm install -g @vue/cli
查看vue脚手架是否安装成功,看一下脚手架版本
出现版本号就是安装成功,否则失败
vue -V
@vue/cli 创建项目启动服务
- 创建项目
- 项目名不能带大写字母,中文和特殊符号
# vue和create是命令, vuecli-demo是文件夹名
vue create vuecli-demo
创建之后按照提示来就可以了。到这儿,那么恭喜你成功了。
@vue/cli 目录和代码分析
vuecil-demo # 项目目录
├── node_modules # 项目依赖的第三方包
├── public # 静态文件目录
├── favicon.ico# 浏览器小图标
└── index.html # 单页面的html文件(网页浏览的是它)
├── src # 业务文件夹
├── assets # 静态资源
└── logo.png # vue的logo图片
├── components # 组件目录
└── HelloWorld.vue # 欢迎页面vue代码文件
├── App.vue # 整个应用的根组件
└── main.js # 入口js文件
├── .gitignore # git提交忽略配置
├── babel.config.js # babel配置
├── package.json # 依赖包列表
├── README.md # 项目说明
└── yarn.lock # 项目包版本锁定和缓存地址
主要弄清楚这几个文件夹就可以了
node_modules下都是下载的第三方包
public/index.html – 浏览器运行的网页
src/main.js – webpack打包的入口文件
src/App.vue – vue项目入口页面
package.json – 依赖包列表文件
- main.js和App.vue以及index.html作用和关系?
- 1.main.js - 项目打包入口 - Vue初始化
- 2.App.vue - Vue页面入口
- 3.index.html - 浏览器运行的文件
- 4.App.vue => main.js => index.html
@vue/cli 自定义配置
- src并列的vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
devServer:{
port:3000, //端口
open:true, //自动打开浏览器
host:"localhost" //设置本地主机地址
}
})
常用命令
在说vue常用命令之前,得先了解vue的编程思想。
- 在vue中,不推荐直接手动操作DOM!!!
- 在vue中,通过数据驱动视图,不要想怎么操作DOM,而是想着怎么操作数据。
- vue采用的是MVVM设计模式即:通过数据双向绑定让数据自动地双向同步 不再需要操作DOM
- V(修改视图) -> M(数据自动同步)
- M(修改数据) -> V(视图自动同步)
- vue指令实质上就是特殊的html标签属性,特点:v-开头
v-bind
- 语法:
v-bind:属性名="vue变量"
- 简写:
:属性名="vue变量"
<!-- vue指令-v-bind属性动态赋值 -->
<a v-bind:href="url">我是a标签</a>
<script>
export default {
data(){
return {
url:"http://www.baidu.com",
}
}
}
</script>
v-on
-
语法
- v-on:事件名="methods中的函数"
- v-on:事件名="methods中的函数(实参)"
-
简写: @事件名="methods中的函数"
<!-- vue指令: v-on事件绑定-->
<p>你要买商品的数量: {
{count}}</p>
<button v-on:click="count = count + 1">增加1个</button>
<button v-on:click="addFn">增加1个</button>
<button v-on:click="addCountFn(5)">一次加5件</button>
<button @click="subFn">减少</button>
<script>
export default {
// ...其他省略
methods: {
addFn(){ // this代表export default后面的组件对象(下属有data里return出来的属性)
this.count++
},
addCountFn(num){
this.count += num
},
subFn(){
this.count--
}
}
}
</script>
v-on事件对象
语法:
- 无传参, 通过形参直接接收
- 传参, 通过$event指代事件对象传给事件处理函数
<template>
<div>
<a @click="one" href="http://www.baidu.com">阻止百度</a>
<hr>
<a @click="two(10, $event)" href="http://www.baidu.com">阻止去百度</a>
</div>
</template>
<script>
export default {
methods: {
one(e){
e.preventDefault()
},
two(num, e){
e.preventDefault()
}
}
}
</script>
v-on修饰符
语法:
-
@事件名.修饰符="methods里函数"
- .stop - 阻止事件冒泡
- .prevent - 阻止默认行为
<template>
<div @click="fatherFn">
<!-- vue对事件进行了修饰符设置, 在事件后面.修饰符名即可使用更多的功能 -->
<button @click.stop="btn">.stop阻止事件冒泡</button>
<a href="http://www.baidu.com" @click.prevent="btn">.prevent阻止默认行为</a>
</div>
</template>
<script>
export default {
methods: {
fatherFn(){
console.log("father被触发");
},
btn(){
console.log(1);
}
}
}
</script>
v-model
-
语法: v-model="vue数据变量"
-
双向数据绑定
- 数据变化 -> 视图自动同步
- 视图变化 -> 数据自动同步
-
最后演示: 用户名绑定 - Vue内部是MVVM设计模式
<template>
<div>
<!--
v-model:是实现vuejs变量和表单标签value属性, 双向绑定的指令
-->
<div>
<span>用户名:</span>
<input type="text" v-model="username" />
</div>
<div>
<span>密码:</span>
<input type="password" v-model="pass" />
</div>
<div>
<span>来自于: </span>
<!-- 下拉菜单要绑定在select上 -->
<select v-model="from">
<option value="北京市">北京</option>
<option value="南京市">南京</option>
<option value="天津市">天津</option>
</select>
</div>
</div>
</template>
<script>
export default {
data() {
return {
username: "",
pass: "",
from: ""
}
}
};
</script>
v-model修饰符
语法:
-
v-model.修饰符="vue数据变量"
- .number 以parseFloat转成数字类型
- 转成数值类型后再赋予给Vue数据变量
- .trim 去除首尾空白字符
- 去除两边空格后把值赋予给Vue数据变量
- .lazy 在change时触发而非input时
- 等表单失去焦点,才把值赋予给Vue数据变量
- .number 以parseFloat转成数字类型
<template>
<div>
<div>
<span>年龄:</span>
<input type="text" v-model.number="age">
</div>
<div>
<span>人生格言:</span>
<input type="text" v-model.trim="motto">
</div>
<div>
<span>自我介绍:</span>
<textarea v-model.lazy="intro"></textarea>
</div>
</div>
</template>
<script>
export default {
data() {
return {
age: "",
motto: "",
intro: ""
}
}
}
</script>
v-text和v-html
-
语法:
- v-html="vue数据变量"
- v-text="vue数据变量"
-
注意: 会覆盖插值表达式
<template>
<div>
<p v-html="str"></p>
<p v-text="str"></p>
</div>
</template>
<script>
export default {
data() {
return {
str: "<span>我是一个span标签</span>"
}
}
}
</script>
- v-html把值当做html解析 v-text把值当做普通的字符串解析
v-show和v-if
- 语法:
- v-show="vue变量"
- v-if="vue变量"
- 原理
- v-show 用的display:none隐藏 (频繁切换使用)
- v-if 直接从DOM树上移除
- 高级
- v-else使用
<template>
<div>
<h1 v-show="isOk">v-show的盒子</h1>
<h1 v-if="isOk">v-if的盒子</h1>
<div>
<p v-if="age > 18">我成年了</p>
<p v-else>还得多吃饭</p>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isOk: true,
age: 15
}
}
}
</script>
- 使用v-show和v-if以及v-else指令, 方便通过变量控制一套标签出现/隐藏
v-for
- 语法
- v-for="(值变量, 索引变量) in 目标结构"
- v-for="值变量 in 目标结构"
- 目标结构:
- 可以遍历数组 / 对象 / 数字 / 字符串
- 注意:
- v-for的临时变量名不能用到v-for范围外
- 同级标签的key值不能重复
- 遍历数组2.
<template>
<div id="app">
<!-- v-for 把一组数据, 渲染成一组DOM -->
<!-- 口诀: 让谁循环生成, v-for就写谁身上 -->
<p>学生姓名</p>
<ul>
<li v-for="(item, index) in arr" :key="item">
{
{ index }} - {
{ item }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
arr: ["小明", "小欢欢", "大黄"]
}
}
</script>
2.遍历数组内对象
<template>
<div id="app">
<!-- 省略其他 -->
<p>学生详细信息</p>
<ul>
<li v-for="obj in stuArr" :key="obj.id">
<span>{
{ obj.name }}</span>
<span>{
{ obj.sex }}</span>
<span>{
{ obj.hobby }}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
// ...省略其他
stuArr: [
{
id: 1001,
name: "孙悟空",
sex: "男",
hobby: "吃桃子",
},
{
id: 1002,
name: "猪八戒",
sex: "男",
hobby: "背媳妇",
}
]
}
}
}
</script>