Vue
Vue基础语法
创建对象及插值表达式
<!-- {{}}: 在html语法中就是一个简单字符串 -->
<!-- {{}}: 在vue语法中, 叫插值表达式 -->
<!-- 插值表达式: 是一个表达式, 这个表达式中使用到的参数, 要去对应的vue对象中取出 -->
<div id="root">
<div>
{{msg1 + msg2}}
</div>
</div>
<script>
// new Vue 创建一个Vue对象
// 一个Vue对象一旦创建, 会立即检测自己的el属性, 找到对应id的html作用域
// 和对应的作用域建立'绑定'关系
// 对应html作用域, 就变成了html + vue语法域
// 对应的新'绑定'的语法域, 要按照Vue语法重新解释
//每个页面的根root只能有一个,vue对象也只能有一个
new Vue({
el: "#root",
data: {// 注意: Vue对象的data, 用来保存, 我们给这个Vue对象自定义的参数
msg1: 123,
msg2: 1
}
})
</script>
v指令
v-bind: 单向绑定
// v-bind: 单向绑定
// 把Vue对象的一个参数, 通过v-bind绑定到对应语法域的标签的属性上,会被vue对象中的参数影响值,但他不能反作用给vue对象
V-model: 双向绑定: 仅能用于表单元素的value
// v-model: 可以把表达元素的value值, 和对应的vue中参数建立双向联系, 相互影响,常用于input框中
V-text: 给一个标签内部插入文本或者带代码的文本
V-html: 极类似于dom操作的innerText和InnerHTML
V-on: 事件监听
// v-on可以监听事件, 把事件触发之后, 响应到vue对象中
// 注意 v-on: 可以简写成@
V-show: 隐藏和显示
V-if
V-else
V-else-if
两者的区别:如果 v-if不满足条件, 不显示, 意味着不会加载到dom上
v-show无论隐藏和显示, 始终都存在于dom树上, 只不过是通过css来隐藏和显示
V-for: 循环语句,一般用于循环渲染
// V-for: 循环语句
注意1: v-for指令做循环渲染的时候, 它所循环渲染的不仅仅只是遍历的内容, 它还会循环渲染出这个v-for指令所在的多个标签,并且对于每一个标签,都要求有一个唯一的key
<div v-for="item in list">
{{item}}
</div>
--------------------------------------
<div>
zs
</div>
<div>
ls
</div>
<div>
wu
</div>
标准的写法:
<div v-for="item in list " :key="item.id">
{{item.name}} --{{item.age}}
</div>
这里要注意,中间要使用:隔开,in可以换成of,没有区别
计算属性和侦听器
计算属性: computed:
指的是一个属性通过其他属性计算而来。可以实时变化
new Vue({
el: "#root",
data: {
num1: 0,
num2: 0
},
computed: {
sum: function () { //sum会自动调用里面的函数,得到结果
return parseInt(this.num1) + parseInt(this.num2)
}
}
})
侦听器/监听器
监听一个属性的改变, 触发一个事件,一定要注意是监听属性,和v-on有本质的区别
watch:
new Vue({
el: "#root",
data: {
inpustr: "",
times: 0
},
watch: {
inpustr: function () {
this.times++
}
}
})
模板和组件
模板
template:
一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略.
<body>
<!--template:-->
<!--一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略.-->
<div id="root"></div>
<script>
// 一个Vue对象一旦创建, 先找el属性, 找到对应的绑定结点对象
// 再检测自己这个Vue对象是否有模板
// 如果有, 解析模板创建结点对象, 替换已经对应绑定的(在dom上那个)对象
new Vue({
el: "#root",
data: {
msg: "zs"
},
template: "<div><div @click='f'>{{msg}}</div></div>",
methods: {
f: function () {
alert("?")
}
}
})
</script>
</body>
简单理解为:root节点被挂载在vue对象上,创建对象的时候找到该节点,然后发现有模板,就将其替换掉,最终将div替换为
<div><div @click='f'>{{msg}}</div></div>
组件
一个Vue对象, 就是一个组件
component:
组件
template:
一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略.
组件的构建流程(非vue项目中使用):先将组件创建成普通的js对象,里面的属性template,即模板,然后在vue对象中的componens里面进行注册,此时组件就作为root对应的vue对象的子组件,同时也是一个vue对象,再将自定义的组件对象写入root的模板中,这样就会自动读取出来
<script>
var son1 = {
template: "<div class='son1'>son1</div>"
}
var son2 = {
template: "<div class='son2'>son2</div>"
}
var son3 = {
template: "<div class='son3'>son3</div>"
}
var son4 = {
template: "<div class='son4'>son4</div>"
}
new Vue({
el: "#root",
data: {},
template: "<div class='div-root'><son1></son1><son2></son2><son3></son3><aaa></aaa></div>",
components: {
son1: son1,
son2: son2,
son3: son3,
aaa: son4,
}
})
</script>
执行的流程:首先加载root挂载的vue对象,发现有模板,进行替换,又发现有son1标签,html中并没有这个标签,识别为vue语法,然后根据son1中的模板来进行替换
生命周期
一个vue对象从创建到消亡的过程中会自动调用的方法
beforeCreate:function () { //创建对象之前
console.log("控制台打印:beforeCreate")
},
created:function () { //对象创建完成
console.log("控制台打印:created")
},
beforeMount:function () {
//页面还未被渲染
console.log(this.$el),
console.log("控制台打印:beforeMount")
},
mounted:function () {
//页面渲染完成
console.log(this.$el),
console.log("控制台打印:mounted")
},
beforeUpdate:function () { //在更新之前
console.log("控制台打印:beforeUpdate")
},
updated:function () { //更新完毕后
console.log("控制台打印:updated")
},
beforeDestroy:function () { //对象销毁前
console.log("控制台打印:beforeDestory")
},
destroyed:function () { //对象销毁完毕后
console.log("控制台打印:destroyed")
}
Vue项目的构建
前后端分离的核心思想:
用户根据url发起请求到前端服务器,然后获得前端代码并解析,在解析的过程中发现需要数据,向后端服务器发起请求,后端从数据库中获取数据并发给用户,用户将前端和数据合在一起形成了带数据的页面
vue项目的构建流程
基础配置(只需安装一次,无需重复进行):
1, 安装node (cnpm)
npm install -g cnpm --registry=https://registry.npm.taobao.org
2, 安装vue-cli:脚手架工具
cnpm install -g @vue/cli
cnpm install -g @vue/cli-init
3, 安装webpack: 模块打包机
cnpm install -g webpack
创建项目:
vue init webpack 项目名(不能为中文)
注意:要选好路径名,可以直接在你想要创建项目的目录下输入cmd快速打开
安装包:cnpm install 此时要注意你安装包的目录是项目所在的根目录
启动这个前端vue项目
命令 npm run dev
关闭这个项目(停止) 命令ctrl + c, 已经关闭
组件之间的传值
父组件向子组件传值
父组件传递: 在子组件定义一个属性, 把父组件的数据通过单向绑定, 绑定到这个属性上
<son1 class="son1" v-bind:username="user.name"></son1>
子组件接收: props专门用来接收父组件的传值
props: ["username"]
注意: props 可以基本上等价看做data, 只不过props专门用来接收父组件的传值, 并且不可修改
使用步骤:首先在组件包下创建子组件的vue对象,并且在属性中写好props参数,然后在App下的子组件模板中写入绑定属性,在使用子组件的时候需要导包进入APP中并完成注册
<son1 class="son1" v-bind:username="user.name" ></son1>
<son2 class="son2" v-bind:userage="user.age"></son2>
<script>
import Son1 from "./components/Son1";
import Son2 from "./components/Son2";
export default {
data(){
return{
user: {
name: "zs",
age: 18,
}
}
}
</script>
<template>
<div>
{{userage}}
</div>
</template>
<script>
export default {
props: ["userage"]
}
</script>
写入绑定完成后,子组件中的username和userage属性就受到父组件中user.name和user.age的影响
子组件向父组件传值
子组件传递:
// 向父组件抛出一个方法
this.$emit("addage", 2)
父组件接收
<son1 v-on:addage="adduserage"></son1>
注意:需要在父组件中的子组件模板里面一直监听,使用v-on来监听事件,addage是我们自定义的方法名,adduserage相当于是将监听到的方法重写一个在父类中的名字,然后在父类中完成该方法的调用,注意参数只能写在methods里面,不能写入模板标签中
methods: {
adduserage: function (num) { //此时的num就是我们传过来的参数2
this.user.age += num
}
}
整体的思想:首先子组件中点击事件触发方法,然后向父组件发出一个名字叫addage参数为2的方法,父组件监听该方法名,并获取该方法,重新命名,这样就可以在父组件中调用了,调用时方法的参数就是从子组件传过来的参数,在父组件中完成对值的修改操作
注意:如果同时调用两个方法,需要在方法名之间用逗号隔开
bus传值
// 单独维护一个中转站传值
1, 创建一个bus文件
最好单独创建一个名为bus的包,专门用来存储bus文件
// 导入vue语法
import Vue from 'vue'
// 根据Vue语法创建一个vue对象
const bus = new Vue()
// 默认暴露这个对象
export default bus
2, 在main,js配置
import bus from './bus'
// 相当于: 给整个项目配置的所有Vue对象配置一个参数: $bus
Vue.prototype.$bus = bus
3, 使用
使用的方法类似于父组件向子组件传值,都是使用方法进行传值
传递值:
this.$bus.$emit("addnum", this.inputnum)
第一个值是方法名,第二个是要传递过去的值,一般调用的是对象中的属性
接收值:
mounted() {
var _this = this
this.$bus.$on("addnum", res => {
_this.times += parseInt(res)
})
mounted类似于props,是一个专门用来监听的区域,on表示监听事件,一直监听addnum这个方法,接收到的参数为res(可自定义),=>表示对这个参数来进行处理,相当于lambda里面的对方法体进行传参
axios网络请求
vue如果要引入/使用别的第三方框架:
1, 导包或者导入配置文件
cnpm install axios --save
2, 在main.js配置
import axios from 'axios'
Vue.prototype.$axios = axios
3, 使用
methods: {
getdata () {
var _this = this this.$axios.get("http://115.29.141.32:8084/api/mall/getGoodsByType?typeId=1").then( res => {
_this.list = res.data.data
})
}
}
methods: {
getdata () {
var _this = this
var obj = {
"amount":100,
"goodsDetailId": 1230,
"num": 1,
"state": 0,
"token": "admin"
}
this.$axios.post("http://115.29.141.32:8084/api/mall/addOrder", obj)
}
}