Vue
·Vue的核心思想是只要改变数据,页面就发生变化
1、vue实例
vue 要在body标签里面,引入一对script标签,src="vue.js"导入vue
再引入一对script来new一个vue的实例,使用
<body>
<div id="app">
被下面的Vue实例接管
</div>
<script src="vue.js"></script>
<script>
//new 一个Vue对象
new Vue({
el: '#app', //el:代表接管的div元素-id是app
data: { //data 是对象里面的数据
sex: 2
},
methods: { //methods:是对象里面的方法
change: function () {
alert('打印alert')
}
}
})
</script>
</body>
vue实例关注:
el: vue接管的div元素
注:只能接管一个div,所有需要vue处理,必须写在这个div内。
data:数据
methods:方法
被vue修饰的div,也是在body中,但是必须在vue实例化之前,因为实例化的时候要拿到el: 否则找不到
2、vue的用法
2.1、{{ xx }}直接显示数据
在div标签里,直接{{}},就能显示在vue里data下定义的数据
{{}}模板语言只能应用于标签中间
<div id="app">
<div>{{sex}}</div>
</div>
2.2、 v-on 指令绑定\绑定事件
<div id="app">
<div>{{sex}}</div>
<input type="button" @click="change" value="指令绑定">
<input type="button" v-on:click="change" value="全写">
</div>
click对应的方法是 vue实例里面的methods的方法
其中 @ 是简写
v-on:是全写
2.3、 v-bind 标签属性绑定
v-bind:
加了v-bind:xxx之后,该xxx属性就可以应用data里面的数据
在属性前面写上v-bind,会自动去寻找vue里面是否有url的值
其中,全写 v-bind:
简写 :
<div id="app">
<a v-bind:href="url">引用data里的url</a>
<a :href="url">简写</a>
</div>
下面就是,{样式表:条件判断} 如果is_bg是true,就应用bg
就是把true动态化了,可以修改data里的数据来影响样式
class引用data里面的classes
class引用bg和box,以data里面的is_bg is_box为条件
<div id="app">
<div :class="classes"></div>
<div :class="{bg:is_bg,box:is_box}"></div>
</div>
2.4、 v-if v-elif-if v-else 条件判断 和v-show
例:接口测试平台,成功 失败,根据后台返回的结果状态。显示对应的文案
其中,phoneNumber是data里面的值
<div id="app">
<span v-if="phoneNumber==10086">移动公司</span>
<span v-else-if="phoneNumber==10010">联通公司</span>
<span v-else>电信公司</span>
<span v-show="phoneNumber==10086">移动公司</span>
</div>
<script src="./day12/vue.js"></script>
<script>
new Vue({
el: '#app',
data:{
phoneNumber: 10010
}
})
</script>
v-if 只有符合条件的元素 才加载
v-show就是 如果条件不匹配,就不展示,会自动加上一个display标签
如果条件为False 则对标签增加 display=none
2.5、 v-for 循环
循环列表和循环列表并且展示脚标
<div id="app">
<!--games:['绝地求生','英雄联盟','王者荣耀']-->
<ul>
<li v-for="game in games">{{game}}</li>
<!-- 要展示脚标的-->
<ul v-for="(game,index) in games">{{game}}--{{index+1}}</ul>
</ul>
</div>
循环字典,展示字典里的value
<div id="app">
<!-- games:{'name':'绝地求生','company':'蓝洞'}-->
<ul>
<li v-for="game in games">{{game}}</li>
</ul>
</div>
循环字典,展示字典里的key,value
<div id="app">
<!-- games:{'name':'绝地求生','company':'蓝洞'}-->
<!--要展示key和value,所有的v-for循环里面,index都是在后面,先是value,后是key-->
<ul>
<li v-for="(value,key) in games">{{key}}:{{value}}</li>
</ul>
</div>
循环 列表里有字典 取出来名字
<div id="app">
<!--games:[{'name': '绝地求生'},{'name':'英雄联盟'},{'name':'王者荣耀'}]-->
<ul>
<li v-for="game in games">{{game.name}}</li>
</ul>
</div>
2.6 v-model 双向数据绑定,就是和value进行绑定
<div id="app">
<!-- v-model 双向数据绑定 输入框-->
<div>{{input_value}}</div>
<!-- 将输入框的输入数据 和input_value进行了双向绑定,input_value的默认是defaul-->
<input type="text" v-model="input_value">
<!--给按钮,绑定了change方法,change方法是将input_value变成厂 value-->
<input type="button" value="change" @click="change">
<!-- 双向绑定 单选框 将选择框的value和sex的值进行了双向绑定-->
<div>{{sex}}</div>
<input type="radio" value="1" name="sex" v-model="sex">男
<input type="radio" value="2" name="sex" v-model="sex">女
<!-- 双向绑定 列表,复选框-->
<div>{{movies}}</div>
<input type="checkbox" value="钢铁侠" v-model="movies">钢铁侠
<input type="checkbox" value="特斯拉" v-model="movies">特斯拉
<!-- 双向绑定,下拉选择框-->
<div>{{movie}}</div>
<select v-model="movie">
<option disabled value="">请选择</option>
<option value="钢铁侠">钢铁侠</option>
<option value="战狼">战狼</option>
</select>
<div>这里是movie:{{movie}}</div>
<select v-model="movie">
<!-- v-model movie就是 将movie和option的value进行了双向数据绑定-->
<!-- 需求是展示name到页面,将id作为value,value必须用 :value,这样才能-->
<!-- 和option.id绑定(:是v-bind的简写,这样能应用data里面的数据)-->
<option disabled value="">请选择</option>
<option v-for="option in options" :value="option.id">{{option.name}}</option>
</select>
</div>
data:{
input_value:'default',
sex:2,
movies:['钢铁侠','战狼'],
movie:'',
options:[{"name":"战狼","id":1},{"name":"特斯拉","id":2},{"name":"钢铁侠","id":3}]
},
methods:{
change:function () {
this.input_value = 'change value'
}
}
2.7、filter 过滤器
<script>
new Vue({
el:"#app",
filters:{
func:function(){
}
}
})
默认将 | 左侧count传递给右侧的方法
{{count|filterFunc}}
可以传多个参数
{{count|filterFunc("test")}}
func:function(value,test){
}
</script>
2.8、VUE的生命周期
mounted–>常用钩子–>完成初始化数据
<script>
new Vue({
el:'#app',
data:{
msg:''
},
mounted:function () {
//钩子函数就是预留的 在各个节点的时候运行的,做修改用的
//获取到数据源,导致了页面的msg的变化
this.msg = '获取到后台数据'
console.log('mounted')
}
})
</script>
2.9、$refs
a)、获取标签
<div ref="test"></div>
this.$refs.test // 获取到标签 可以理解为 document.getElementbyID 获取的是标签对象
b)、获取组件
<test ref="a"></test>
this.$refs.a.xxxx // 可以获取组件中的data声明的数据
console.log(this.$refs.a.number)
一个例子
<div id="app">
<!-- div里面的都是父组件,引用的别的组件都是子组件-->
<test ref="a"></test>
<test ref="b"></test>
<div>父组件-{{count}}</div>
<input type="button" value="test" @click="change">
</div>
<script src="vue.js"></script>
<script>
//实例化一个子组件,test是子组件的名字,template是子组件的写法
Vue.component('test',{
template:'<div>子组件-<span @click="add">{{number}}</span></div>',
//子组件的data数据的写法
data:function () {
return{
number:0
}},
methods:{
add:function () {
this.number++
}
}
})
new Vue({
el:'#app',
data:{
count:0
},
methods:{
change:function () {
// 可以获取到当前页面的所有使用了refs的标签
// console.log(this.$refs)
// 将两个子组件写了ref标签-ref='a',那么$refs.a就是第一个组件
// $ref.b就是b组件,$ref.b.number就能拿到b组件的number的值
console.log(this.$refs.a.number)
console.log(this.$refs.b.number)
this.count = this.$refs.a.number+this.$refs.b.number
}
}
})
</script>
c)、组件化时,如果一个元素是由多个标签组成,内部的标签,想组件化不可以直接使用,需要用is属性指定组件
比如,表格就是多层级标签组成的,内部的行、列要使用组件,需要声明
<table border="1">
<thead>
<th>id</th>
<th>method</th>
<th>状态</th>
</thead>
<tbody>
<!-- <tr-demo></tr-demo>-->
<tr is="tr-demo"></tr>
</tbody>
</table>
Vue.component('tr-demo',{
template:'<tr><td>1</td><td>post</td><td>失败</td></tr>'
})
new Vue({
el:'#app'
})