@vue/cli是Vue官方提供的一个全局模块包(得到vue命令), 此包用于创建脚手架项目
快速搭建项目结构,安装命令:
yarn global add @vue/cli
# OR
npm install -g @vue/cli
用脚手架创建项目需要四个步骤:
创建项目
# vue和create是命令, vuecli-demo是文件夹名
vue create vuecli-demo
选择模板
通过键盘的上下箭头选择合适的模板,如果选择错了,可以按下ctrl+c终止操作。
选择你需要的模板 vue2/vue3
安装依赖
如果安装了yarn,第一次会让你选择以哪种方式下载第三方包(use yarn或use npm),可根据个人习惯选择 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x98ybehk-1656308454205)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1941827cdfa9447e8e2ae248510397a4~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]
启动项目
记得 cd vuecil-demo到根文件夹
启动项目
yarn serve
# OR
npm run serve
之所以用这个命令可以进行项目启动是脚手架帮我们在package.json中添加了自定义命令:
可以自行修改,同样的项目打包命令:
yarn build
# OR
npm run build
我们会得到一个项目的架子:
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文件
├── package.json # 描述项目及项目
├── .gitignore # git提交忽略配置
├── babel.config.js # babel配置
├── README.md # 项目说明
└── package-lock.json # 项目包版本锁定和下载地址
要想覆盖webpack的配置,需要在vue.config.js中配置,如默认我们启动项目服务时,不会自动打开浏览器,我们可以自行配置:
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
devServer:{
host: 'localhost',
open: true,
port: 3000
}
})
另外,初学者可以设置关闭eslint,熟练之后再打开
lintOnSave: false
转变思维, 用数据驱动视图改变, 操作dom的事, vue源码内干了
设计模式: 是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。
MVVM,一种软件架构模式,决定了写代码的思想和层次
MVVM通过数据双向绑定
让数据自动地双向同步 不再需要操作DOM
可以在devtool工具(Chrome的插件)改变M层的变量, 观察V层(视图的自动同步),可在以下插件地址自行下载:chrome.zzzmh.cn/#/index
1. 在vue中,不推荐直接手动操作DOM!!!
2. 在vue中,通过数据驱动视图,不要在想着怎么操作DOM,而是想着如何操作数据!! (思想转变)
vue指令, 实质上就是特殊的 html 标签属性, 特点: v- 开头
每个指令, 都有独立的作用
功能: 数据渲染。 将数据(变量,或者利用ajax从后端获取到的数据)展示到页面上。这里它不会直接操作dom,而是有自己的语法。
<template>
<div>
<h1>{{ msg }}</h1>
<h2>{{ obj.name }}</h2>
<h3>{{ obj.age > 18 ? '成年' : '未成年' }}</h3>
</div>
</template>
<script>
export default {
data() { // 格式固定, 定义vue数据之处
return { // key相当于变量名
msg: "hello, vue",
obj: {
name: "小vue",
age: 5
}
}
}
}
</script>
<style>
</style>
{{ }} 可以:
写data数据字段名称
对data数据字段进行表达式运算
功能: 给标签属性设置vue变量的值
v-bind:属性名="vue变量"
:属性名="vue变量"
<!-- vue指令-v-bind属性动态赋值 -->
<a v-bind:href="url">我是a标签</a>
<img :src="imgSrc">
总结: 把vue变量的值, 赋予给dom属性上, 影响标签显示效果
功能: 列表渲染, 所在标签结构, 按照数据数量, 循环生成
语法:标签 v-for=“(值, 索引或者属性名) in 目标结构” :key=“唯一值”></标签>
索引可以省略
目标结构可以是:数组 / 对象 / 数字
注意:
v-for的临时变量名不能用到v-for范围外
<template>
<div>
<ul>
<li v-for="(item, index) in arr" :key="item.id">
{{ index + 1 }}---{{ item.name }}// item代表数组中的每一项,index代表当前下标
</li>
</ul>
<hr />
<ul>
<li v-for="(value, key) in obj" :key="key">{{ value }}---{{ key }}</li>
// value代表对象中的值,key表示属性名
</ul>
<hr />
<ul>
<li v-for="index in 100" :key="index">
我爱你 // index代表1~100中的数字
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
obj: { a: 100, b: 200 },
arr: [
{ id: 1, name: "张三" },
{ id: 2, name: "王五" },
{ id: 3, name: "李四" },
],
};
},
};
</script>
<style>
</style>
功能 : 更新DOM对象的innerText/innerHTML
语法:
注意: 会覆盖插值表达式
<template>
<div>
<p v-text="str"></p>
<p v-html="str"></p>
</div>
</template>
<script>
export default {
data() {
return {
str: "<span>我是一个span标签</span>"
}
}
}
</script>
v-text把值当成普通字符串显示, v-text ===> innerText
v-html把值当做html解析,v-html ===> innerHTML
功能 : 控制标签的隐藏或出现
语法:
如果vue变量的值为true,就可见,否则就不可见。
原理
<template>
<div>
<h1 v-show="isOk">v-show的盒子</h1>
<h1 v-if="isOk">v-if的盒子</h1>
<div>
<p v-show="age > 18">我成年了</p>
<p v-if="age > 18">我成年了</p>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isOk: true,
age: 15,
}
}
}
</script>
v-show 性能较好,对应需要频繁切换显示与隐藏的功能,可以使用v-show。
v-if 会动态创建和删除元素。
特殊的适用v-if的场景:如果是登陆用户就显示头像
注意避免v-for和v-if在一起使用
Vue 处理指令时,v-for 比 v-if 具有更高的优先级, 虽然用起来也没报错好使, 但是性能不高, 如果你有5个元素被v-for循环, v-if也会分别执行5次.
功能 : 模板中的选择结构
与js中的if选择结构是一致的。
<标签 v-if="条件"> </标签>
<标签 v-else-if="条件"> </标签>
<标签 v-else-if="条件"> </标签>
<标签 v-else> </标签>
示例:
<template>
<div>
<p v-if="flag > 80">优秀</p>
<p v-else-if="flag >= 60">一般</p>
<p v-else>不及格</p>
</div>
</template>
<script>
export default {
data() {
return {
flag: 70,
};
},
};
</script>
<style>
</style>
功能 : 给标签绑定事件
语法
简写: @事件名=“methods中的函数”
<template>
<div>
<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>
</div>
</template>
<script>
export default {
data() {
return {
count: 1,
};
},
methods: {
addFn(){ // this代表export default后面的组件对象(下属有data里return出来的属性)
this.count++
},
addCountFn(num){
this.count += num
},
subFn(){
this.count--
}
}
}
</script>
目标: vue事件处理函数中, 拿到事件对象(这里的事件对象与原生js操作dom获取来的完全一样)
语法:
<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>
功能 : 在事件后面.修饰符名 - 给事件带来更强大的功能
语法:
@事件名.修饰符=“methods里函数”
<template>
<div @click="fatherFn">
<!-- vue对事件进行了修饰符设置, 在事件后面.修饰符名即可使用更多的功能 -->
<button @click.stop="btn">.stop阻止事件冒泡</button>
<a href="http://www.baidu.com" @click.prevent="btn">.prevent阻止默认行为</a>
<button @click.once="btn">.once程序运行期间, 只触发一次事件处理函数</button>
</div>
</template>
<script>
export default {
methods: {
fatherFn(){
console.log("father被触发");
},
btn(){
console.log(1);
}
}
}
</script>
目标: 给键盘事件, 添加修饰符, 增强能力
语法:
<template>
<div>
<input type="text" @keydown.enter="enterFn">
<hr>
<input type="text" @keydown.esc="escFn">
</div>
</template>
<script>
export default {
methods: {
enterFn(){
console.log("enter回车按键了");
},
escFn(){
console.log("esc按键了");
}
}
}
</script>
功能 : 把value属性和vue数据变量, 双向绑定到一起
语法: v-model=“vue数据变量”
双向数据绑定
<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>
<!-- (重要)
遇到复选框, v-model的变量值
非数组 - 关联的是复选框的checked属性
数组 - 关联的是复选框的value属性
-->
<span>爱好: </span>
<input type="checkbox" v-model="hobby" value="抽烟">抽烟
<input type="checkbox" v-model="hobby" value="喝酒">喝酒
<input type="checkbox" v-model="hobby" value="写代码">写代码
</div>
<div>
<span>性别: </span>
<input type="radio" value="男" name="sex" v-model="gender">男
<input type="radio" value="女" name="sex" v-model="gender">女
</div>
<div>
<span>自我介绍</span>
<textarea v-model="intro"></textarea>
</div>
</div>
</template>
<script>
export default {
data() {
return {
username: "",
pass: "",
from: "",
hobby: [],
sex: "",
intro: "",
};
}
};
</script>
总结:
v-model适用于表单开发,自动获取用户输入或选择数据 特别注意: v-model, 在input[checkbox]的多选框状态时 变量为非数组, 则绑定的是checked的属性(true/false) - 常用于: 单个绑定使用 变量为数组, 则绑定的是他们的value属性里的值 - 常用于: 收集勾选了哪些值
功能 : 让v-model拥有更强大的功能
语法:
v-model.修饰符=“vue数据变量”
<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-bind给标签class设置动态的值
语法:
格式1:<标签 :class=“变量” />
格式2:<标签 :class=“{类名1: 布尔值, 类名2: 布尔值}” />
<template>
<div>
<input type="text" v-model="num" />
<!-- 输入的值大于50就变红 -->
<p :class="{ red: num > 50 }">
{{ num }}
</p>
<p :class="color">哈哈哈哈哈</p>
</div>
</template>
<script>
export default {
data() {
return {
num: "",
color: "red",// 变量接收定义好的类名
};
},
};
</script>
<style>
.red {
color: red;
}
</style>
说明:可以和静态class共存
功能 : 给标签动态设置style的值
语法:
<template>
<div>
<p :style="{ backgroundColor: colorStr }">动态style</p>
<p :style="objStyle">动态style,对象</p>
</div>
</template>
<script>
export default {
data() {
return {
colorStr: "red",
objStyle: {
fontSize: "30px",
// css样式中的 带 - 的属性必须用驼峰命名或者 属性名加引号 "font-size"
color: "blue",
},
};
},
};
</script>
<style>
</style>
说明: 可以和静态style共存
更多指令官网可查:cn.vuejs.org/