new Vue():它是Vue里的内置对象,传递参数是对象类型传递
<script src="js/vue.js"></script>
<script>
new Vue({
})
</script>
修饰符:
这样定义可以实现数据分离,不用像原生js那样去绑定,且可以直接在控制台去修改值,当数据发送改变时,界面也会跟着改变
<div id="name">{{message}}div>
body>//写在head中没用
<script src="js/vue.js">script>
<script>
const name=new Vue({
el:"#name",//挂载,管理这个div
data:{
message:"年后"
}
})
script>
<div id="name">
<ul>
<li v-for="item in movies">{{item}}li>
ul>
div>
<script src="js/vue.js">script>
<script>
const name =new Vue({
el:"#name",
data:{
//列表自然是用数组声明
movies:["海贼王","盗梦空间","大话西游","大鱼"]
}
})
script>
列表展示:声明是数组
v-for:可以想象成foreach,将值赋给item,item进行遍历
可以在浏览器中控制台上再添加数据:在具体变量后加入push方法
第一种方式实现:
<div id="name">
<h3>当前计数:{{num}}h3>
<button v-on:click="num++">+button>
<button v-on:click="num--">-button>
div>
<script src="js/vue.js">script>
<script>
const name=new Vue({
el:'#name',
data:{
num:0
}
})
script>
第二种方式实现
给button设置一个函数,并在Vue对象中实现
methods:方法区
this:指向当前对象,所以可以直接拿到num属性
Model层
View层
ViewModel
<div id="app">
<h3>{{num}}h3>
<h3 v-once>{{num}}h3>
div>
<script src="js/v2.6.10/vue.js">script>
<script>
const app = new Vue({
el:'#app',
data:{
num:0
}
})
script>
<div id="app">
<a v-bind:href="aHref">百度a>
<br />
<a :href="aHref">百度a>
div>
<script src="js/v2.6.10/vue.js">script>
<script>
const app = new Vue({
el:'#app',
data:{
num:0,
aHref:'https://ww.baidu.com'
}
})
script>
除了在标签上编译class名,也可以使用方法的形式去编译,且于普通class属性同时存在
绑定style属性(对象语法)
使用语法糖且使用方法的方式返回
当我们在静态页面页面拼接字符时,整体效果不好
计算属性可以看成是一个对象的get方法,且去掉()
计算属性并不是方法,computed是将它里面的方法当作属性来使用
computed里的方法可以看成是一个对象,里面有getter和setter
computed:{
Name:{
set:function(newValue){
},
get:function(){
return this.filstName +' '+ this.lastName
}
}
如计算属性的具体内容如上,是有set和get方法,set需要对应的返回值,但我们一般不使用set方法,所有就有了简便方法
计算属性会有一个缓存,每次你用的时候都会看体内的属性有没有改变,没有改变就直接填充,且只填充一次,不需要每次都加载。效率就比methods高
可以看到methods运行了三次,而computed只运行了一次
const name='why';
const age=18;
const height=1.88;
//它会将name作为key,why作为value
const obj ={
name;
age;
height
}
//往常写法
const obj={
run:function(){
}
}
//增强写法
const obj={
run(){
}
}
//原写法
<li v-on:click="getClick" >{{temp}}li>
//语法糖
<li @click="getClick" >{{temp}}li>
如果该方法不需要额外参数,那么方法后的()可以不添加
<li @click="getClick" >{{temp}}li>
methods:{
getclick(event){
consolo.log(event)
}
}
<li @click="getClick(123,$event)" >{{temp}}li>
methods:{
getclick(abc,event){
consolo.log(abc,event)
}
}
如果不写(),event对象会在第一个形参中,即abc中!
<div @click="divClick">
<button @click.stop="btnClick">按钮button>
div>
<div id="app">
<form action="https://www.baidu.com">
<button type="submit" @click.prevent="submitClick">提交button>
form>
div>
<div id="app">
<input type="text" @keyup.enter="keyClick" />
div>
<div id="app">
<h3 v-if="score>=90">优秀h3>
<h3 v-else-if="score>=80">良好h3>
<h3 v-else-if="score>=60">及格h3>
<h3 v-else>不及格h3>
div>
//当条件为false时,vue会将它从dom元素中删除,当为true时,又会出现
<h3 v-if="score>=90">优秀h3>
//当条件为false时,vue会给他添加一个行内样式,display:none,并显示
<h3 v-show="score>=90">优秀h3>
this.letters.unshift('11','22');
this.letters.push('a');
this.letters.pop();
this.letters.shift();
this.letters.sort();
//删除元素,从下标1开始包含1,删除2个元素
//删除前:1,2,3,4,5 删除后:1,4,5
this.letters.splice(1,2)
替换元素
//替换元素,从下标1开始包含1,替换2个元素,后面为替换的指
//替换前:1,2,3,4,5 替换后:1,a,b,4,5
this.letters.splice(1,2,'a','b')
插入元素
//插入元素,在下标1插入元素,0:不删除也不替换
//插入前:1,2,3,4,5 插入后:1,a,b,2,3,4,5
this.letters.splice(1,0,'a','b')
filter:必须返回一个布尔值
true:将当前元素添加到新的数组,数组为filter内部创建
false:过滤函数
const nums=[10,20,40,120,440,770,110];
//n:nums数组的元素
let newNums=nums.filter(funcrtion (n){
return n>100
})
console.log(newNums);//[120,440,770,110]
map:将返回的值,添加到新的数组中,数组为map函数内部创建
const nums=[10,20,40];
//n:nums数组的元素
let newNums=nums.filter(funcrtion (n){
return n*2
})
console.log(newNums);//[20,40,80]
- reduce:将数组中的元素进行汇总(元素相加)
```html
const nums=[10,20,30,40];
//temp初始值为0 n为nums数组的元素
let total= nums.reduce(function(temp ,n){`在这里插入代码片`
return temp+n//返回相加的值
},0)
const arrs=[10,20,30,40,110]
let total=arrs.filter(arr => arr<100).map(arr => arr*2).reduce((temp,arr)=>temp+arr);
console.log(total);//200
v-model作用原理如下:
可以将v-model想象成一个语法糖,背后其实包含两个操作
//v-model
<input type="text" v-model="message" />
//原理:v-on:input:绑定input的value事件,当value的值发生改变就触发
//$event.target.value; $envent:浏览器的event对象 target.value:获取input的值
v-model结合radio类型使用
可以看到被选中的是男时,h3标签也会显示男,因为v-model双向绑定了input的value属性
radio:绑定同一属性,所以只能单选
label:点击文字时,也可以选中
我们每次在input中实时写入数据,而对象中的数据也要跟着实时更新,会浪费掉一些不必要的资源,所以当input标签失去焦点时,再实时更新数据
lazy:当用户敲enter或者失去焦点时再实时更新数据。
<input type="text" v-model.lazy="message" />
//修饰了number,所以v-model会将数据以number(int)类型传入过去
<input type="number" v-model.number="age" />
<input type="number" v-model.trim="name" />
// 第一步:创建组件构造器 需要拿到vue对象 及extend方法
//template:模板(文本内容),要显示的html代码
const cpnC = Vue.extend({
template :`<div>
<h2>我是标题h2>
<p>我是内容p>
div>`
})
//第二步:注册组件 myCpn:组件的标签名 cpnC:组件构造器
Vue.component('my-cpn', cpnC)
<div id="app">
<my-cpn>my-cpn>
div>
//注册组件 myCpn:组件的标签名 cpnC:组件构造器
Vue.component('my-cpn', cpnC)
const app = new Vue({
el:'#app',
data:{
name:'张三'
},
components:{
cpn: cpnC
}
})
注:cpn为组件的标签名,尽量不要使用“-”
const cpnC1 = Vue.extend({
template :`<div>
<h2>我是标题1h2>
<p>我是内容p>
div>`
})
const cpnC2 = Vue.extend({
template :`<div>
<h2>我是标题2/h2>
<p>我是内容p>
div>`
})
const cpnC2 = Vue.extend({
const cpnC2 = Vue.extend({
template :`<div>
<h2>我是标题h2>
<p>我是内容p>
<cpn1>cpn1>
div>`
,
components:{
cpn1:cpnC1
}
})
const app = new Vue({
el:'#app',
data:{
name:'张三'
},
components:{
cpn: cpnC2
}
})
在全局组件中,这样我们就可以内部创建组件构造器
Vue.component('cpn',{
template :`<div>
<h2>我是标题h2>
<p>我是内容p>
div>`
})
在局部组件
const app = new Vue({
el:'#app',
data:{
name:'张三'
},
components:{
cpn: {
template :`<div>
<h2>我是标题h2>
<p>我是内容p>
div>`
}
}
})
Vue.component('cpn',{
template:'#cpnC',
data() {
return {
title:'我是头部',
name:'我是内容'
}
}
})
子组件可以指定父组件传递进来的数据类型
components:{
cpn:{
template:'#cpn',
props:{
//对象形式 Array:数组 Number:整数
mymovies:Array,
mynum:Number
}
}
子组件指定默认值
components:{
cpn:{
template:'#cpn',
props:{
//对象形式 Array:数组 Number:整数 default:默认值
mymovies:{
type:Array,
default:['']
},
mynum:{
type:Number,
default:0
}
}
}
}
<div id="app">
<cpn @btnclick="cpnclick">cpn>
div>
<template id="cpn">
<div>
<button v-for="item in movies" @click="btnClick(item)">
{{item.name}}
button>
div>
template>
<script src="../js/v2.6.10/vue.js">script>
<script>
//实例vue
const app =new Vue({
el:'#app',
components:{
cpn:{
template:'#cpn',
data() {
return {
movies:[
{id:01,name:'西游记'},
{id:02,name:'水浒传'},
{id:03,name:'三国演义'}
]
}
},
methods:{
btnClick(item){
//子组件发送一个事件
this.$emit('btnclick',item);
}
}
}
},
methods:{
cpnclick(item){
console.log('父组件',item)
}
}
})
script>
使用refs方式:开发中常用
在子标签名上加上ref=“别名”
在具体方法中,使用this.$refs.别名.子组件的方法名(属性)就好