vue基础语法 及指令

vue mustache语法糖-- {{ }} 

它是用来操作dom的,指令就是绑定在DOM的一个属性,并且这属性具有一定功能。
  • 以后我们不在像以前一样,先获取DOM,在操作了,我们现在可以直接使用指令来操作DOM
  • 这个指令需要模板语法的支持,所以我们采用jsx语法糖

jsx: javascript + xml

JSX 是一种JavaScript的语法扩展,其格式比较像是模版语言,但事实上完全是在JavaScript内部实现的。

可以让我们在dom结构中输写javascript

vue 简洁模板语法

<div id="app">       
<p> {{ this.msg }} </p>  // {{ msg }} 是 this.msg 简写
<p> {{ this.$data.msg }} </p>
<p> {{ this._data.msg }} </p>
<p> {{ msg }} </p>

// this.$data.msg -> this.msg -> msg

$data _data 方法都可以在vue的函数的原型中找到
</div>


var vm = new Vue({
el: '#app',
data: {
msg: 'hello vue.js'
    }
})

下面这种写法等同于上面的模板写法
var vm = new Vue({
el: `
<div id="app">
<p> {{ ${ this.msg } }} </p>
</div>
`,
data: {
msg: 'hello vue.js'
    }
})

注意:使用vue模板时,必须引用vue.js

<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>

mustache语法糖对数据类型的支持( js语法的支持 )

回顾数据类型划分

数据类型:
    第一种划分:
        基础数据类型: number string boolean
        复杂数据类型: Object( array function )
        特殊数据类型: null undefined
    第二种划分:
        初始数据类型: number string boolean null undefined
        引用数据类型: object( array function )

 mustache支持我们js的数据类型的

<div id="app">
<p> number: {{ num }} </p>
<p> string: {{ str }} </p>
<p> boolean: {{ bool }} </p>
<p> null: {{ nul?'1':'2' }} </p>
<p> undefined: {{ und && 1 || 2 }} </p>
<p> object: {{ obj.name }} </p>
<p> array: {{ arr[0] }} </p>
<p> fn: {{ fn() }} </p>
<!-- <p> console.log: {{ console.log( 1 ) }} </p>
<p> alert: {{ alert( 2 ) }} </p> -->
</div>

var vm = new Vue({
el: '#app',
data: {
num: 100,
str: 'hello Vue.js',
bool: true,
nul: null,
und: undefined,
obj: {
name: 'Gabriel Yan'
    },
arr: [1,2,3,4],
fn: function () {
alert( 2 )
return '这是一个函数'
    }
  }
})

注意: conosle.log 和 alert 在我们mustache语法中是不支持的 但是如果放在函数体内执行是可以的

mustache 绑定 dom的属性

案例: v-html

<div id="app">
<p v-html = "h"></p> // html可以识别标签
<p v-text = "msg"></p> // text不可以识别标签
<p v-text = " flag && 1 || 2 " > </p> // 数据值也可以直接写成表达式的形式
</div>

var vm = new Vue({
el: '#app',
data: {
msg: 'hello Vue.js',
h: '<h3> hello Vue.js </h3>',
flag: true
    }
})

分析: 发现dom元素直接有了一个内容
这种属性绑定就是为了操作dom

结论: 这种属性绑定的形式就是为了操作dom,我们给这种属性起了一个好听的名字

Vue 1.0 叫它 属性指令( 借鉴Angular来的 )
Vue 2.0 统称为 ‘指令’

指令是用一个 v-xxx 表示
指令是用来操作dom
Vue中不允许直接操作dom
mustache语法 --- 属性写法 的属性值是直接写数据的,不需要使用 {{ }}


Vue指令

问题: 我们说vue是 MVVM 框架, 那么谁是 M 谁是 V 谁是 VM ?

M: Model 数据 --data
V: View 视图 --el
VM: ViewModel 视图模型( new Vue() )

<!-- V -->
<div id="app"></div>

var vm = new Vue({
el: '#app',//给跟实例一个模板( 挂载
data: { //M

    }
})

指令: ( 是绑定在dom属性上 )

v-html: 可以解析标签型数据( 可以将一个数据展示在一个dom的内容中( 相当于使用了 innerHTML ))

v-text: 可以将一个数据展示在一个dom的内容中( 相当于使用了 innerTEXT )

条件渲染的指令

v-show: 可以控制一个dom的显示隐藏( 这个指令操作的是dom的display属性 )

v-if: 可以控制一个dom的存在与否( 创建 和 销毁 )
v-else
v-else-if

<div id="app">
<h3> v-show </h3>
<p v-show = "showFlag"> v-show指令 </p>
<hr>
<h3> v-if - 单路分支 </h3>
<p v-if = "ifFlag"> v-if - 指令的单路分支 </p>
<h3> v-if - 双路分支 </h3>
<p v-if = "ifFlag"> 双路分支 成立 </p>
<p v-else> 双路分支不成立 </p>


<h3> v-if - 多路分支 </h3>
<p v-if = " type === 'A'"> A </p>
<p v-else-if = " type === 'B'"> B </p>
<p v-else> C </p>
</div>

var vm = new Vue({
el: '#app',//给跟实例一个模板( 挂载 )
data: {
showFlag: true,
ifFlag: false,
type: 'A'
    }
})

面试题( 实用题 ) 【 钻石 】
    
  1. v-if vs v-show 区别
    v-if 操作的是dom元素( 组件 ) 的创建或是销毁
    v-show 操作的是dom元素的display属性
    v-if可以有多种使用形式: 单路分支, 多路分支, 双路分支
    v-show 只能写一个单路形式

  2. 实用: 项目中 如何选择这两个使用
     一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。
    因此,如果需要非常频繁地切换,则使用 v-show 较好;
    如果在运行时条件很少改变,则使用 v-if 较好。


列表渲染的指令

v-for:
    1. 数组 v-for = " (item,index) in arr " item是arr中每一个元素
    2. 对象 v-for = "(item,key,index) in obj " item是obj的属性值
    3. json类型数据
    4. 嵌套类型数据

<div id="app">

<h3> 数组 </h3>
<ul>
    <li v-for = " (item,index) in arr ">
        <p> item :{{ item }} -- index: {{ index }}</p>
    </li>
</ul>
<hr>

<h3> 对象 </h3>
<ul>
    <li v-for = "(item,key,index) in obj">
        <p> value: {{ item }} -- key: {{ key }} -- {{ index }} </p>
    </li>
</ul>
<hr>

<h3> json </h3>
<ul>
    <li v-for = "(item,index) of json">
        <p> id: {{ item.id }} </p>
        <p> task: {{ item.task }} </p>
        <p> {{ index }} </p>
    </li>
</ul>
<hr>

<h3> 嵌套 </h3>
<ul>
    <li v-for = " item in lists ">
        <p> id: {{ item.id }} </p>
        <ul>
            <li v-for = "todo in item.todos">
                todos中的数据 -- {{ todo }}
            </li>
        </ul>
    </li>
</ul>
</div>

new Vue({
    el: '#app',
    data: {
        arr: [1,2,3,4],
        obj: {
            id: 1,
            name: '骏哥',
            sex: 'man',
            age: 18
        },
        json: [
            {
                id: 1,
                task: '敲代码1'
            },
            {
                id: 2,
                task: '敲代码2'
            }
         ],
        lists: [
            {
                id: 1,
                todos: {
                        id: 1,
                        name: '连城'
                    }
            },
            {
                id: 2,
                todos: {
                        id: 2,
                        name: '文武'
                    }
            }
        ]
    }
})

key

给每一个循环的列表添加一个唯一的标识

使用指令 v-bind 来绑定 key
<div v-for = " (item,index) in lists" v-bind: key = " item.id "></div>

如果有id,那么我们就使用id,如果没有,我们才会选择index

v-bind: 单项数据绑定: 将一个数据绑定在一个dom的属性上
eg:  key = " item.id 将item.id值绑定给了key

简写:
<div v-for = " (item,index) in lists" :key = " item.id "></div>

<div id="app">
<h3> 数组 </h3>
<ul>
<li v-for = " (item,index) in arr " v-bind:key = "index">
<p> item :{{ item }} -- index: {{ index }}</p>
</li>
</ul>
<hr>
<h3> 对象 </h3>
<ul>
<li v-for = "(item,key,index) in obj" v-bind:key = "index">
<p> value: {{ item }} -- key: {{ key }} -- {{ index }} </p>
</li>
</ul>
<hr>
<h3> json </h3>
<ul>
<li v-for = "(item,index) of json" v-bind:key = " item.id ">
<p> id: {{ item.id }} </p>
<p> task: {{ item.task }} </p>
<p> {{ index }} </p>
</li>
</ul>
<hr>
<h3> 嵌套 </h3>
<ul>
<li v-for = " item in lists " :key = "item.id">
<p> id: {{ item.id }} </p>
<ul>
<li v-for = "todo in item.todos">
todos中的数据 -- {{ todo }}
</li>
</ul>
</li>
</ul>
</div>



new Vue({
el: '#app',
data: {
arr: [1,2,3,4],
obj: {
id: 1,
name: '骏哥',
sex: 'man',
age: 18
},
json: [
{
id: 1,
task: '敲代码1'
},
{
id: 2,
task: '敲代码2'
}
],
lists: [
{
id: 1,
todos: {
id: 1,
name: '连城'
}
},
{
id: 2,
todos: {
id: 2,
name: '文武'
}
}
]
}
})

Vue中给dom添加类名

为什么要绑定类名?
指令是用来操作dom
目的: 为了将来通过数据来操作类名,类名操作dom

1. 直接在dom上绑定类名

2. vue中类名绑定 - 对象形式
目的: dom身上属性class 要和 数据绑定
解决:v-bind
数据中key,我们起的和绑定的对象中的key一样,但是你得知道这两个东西不一样
<p :class = "{ size,bg_color }"></p>
size是自定义的属性, 它的属性值是undefined, 相当于是false
<p :class = "{ size: true, bg_color: true }"></p>
size也是自定义属性,他的属性是true,那么就会加上去
<p :class = "{ [s]: true, [bg_color]: true }"></p>
格式: v-bind:class = "{ 属性: boolean }"
格式: v-bind:class = "{ [data]: boolean }"

3. vue中类名绑定的形式 - 数组的形式 【 推荐 】
格式: v-bind:class = "[ 数据 ]"

4. 类名绑定不会覆盖原先的类名

<style>
.box {
width: 100px;
height: 100px;
}
.bg_color {
background-color: red;
}
</style>

<div id="app">
<!-- 直接添加类名 -->
<p class="box bg_color"></p>

<!-- 对象形式添加类名 -->
<!-- 第一种 -->
<p :class="{box,bg_color}"></p>


<!-- 第二种 -->
<p :class="{box:true,bg_color:true}"></p>


<!-- 第三种 -->
<p :class="{[box]:true,[bg_color]:true}"></p>


<!-- 第四种 以运算式作为属性值-->
<p :class="{[box]:5>3?true:false,[bg_color]:10>1}"></p>


<!-- 以数组形式添加类名 -->
<!-- 第一种 -->
<p :class="[box, bg_color]"></p>


<!-- 第二种 -->
<p :class="['box','bg_color']"></p>


<!-- 第三种 -->
<p :class="[flag?box:'box',bg_color]"></p>
</div>

<script>
new Vue({
el: '#app',
data: {
box: 'box',
bg_color: 'bg_color',
flag: true
}
})
</script>

Vue给dom添加样式

样式的绑定:
v-bind: style = ""
1. 对象的形式
2. 数组的形式

<div id="app">
<!-- 对象形式-->
<p :style="{ width:'100px',height:'100px',background:size.background }"></p>


<!-- 数组形式-->
<p v-bind:style="[{width:'100px',height:size.height},{background:size.background}]"></p>
</div>

new Vue({
el: '#app',
data: {
size: {
width: '100px',
height: '100px',
background: 'red'
}
}
})

Vue的事件添加

回顾:

问题: javascript事件添加有几种形式?

1. 事件绑定

dom.onclick = function () {}
dom: 事件源
on: 绑定事件的形式
click: 事件类型
function(){} 事件处理函数

2. 事件监听 : addeventListener

3. 直接在标签中绑定事件
<div onclick = "事件名称"></div>

vue采用了第三种,也是通过属性的形式绑定在dom身上
<div v-on:click = "事件名称"></div>

事件: v-on使用

事件源
事件绑定形式
事件类型
事件处理程序

v-on:eventType = " handlerName "
简写 v-on: --- > @

<div id="app">
<button v-on:click = "helloHandler"> 点击 </button>
<button @click = "helloHandler"> 点击 </button>
</div>


var vm = new Vue({
el: '#app',
methods: {
// 存放事件处理程序
helloHandler () {
alert( 'hello' )
}
}
})


回顾:

问题: 函数调用有哪些方法?
直接调用 ()
事件调用

<div id="app">
<button v-on:click = "helloHandler( 100 )"> 点击 </button>
<button @click = "helloHandler( 200 )"> 点击 </button>
</div>

var vm = new Vue({
el: '#app',
methods: {
// 存放事件处理程序
helloHandler ( num ) {
alert( num )
}
}
})

事件对象也可以正常使用, 在事件处理程序中, 写e就可以了

<div id="app">
<button v-on:click = "helloHandler"> 点击 </button>
<button @click = "helloHandler"> 点击 </button>
</div>

var vm = new Vue({
el: '#app',
methods: {
// 存放事件处理程序
helloHandler ( e ) {
console.log( e )
}
}
})

在控制台会输出一个事件对象:



问题: 

如果事件处理程序中有三个参数,第三个参数才是事件对象e,如何实现?

分析: 我们发现事件处理程序中的第三个参数 e 不在是事件对象了,而是一个undefined

<div id="app">
<button v-on:click="helloHolder(10,20)">点击</button> // 第三个参数不传
<button @click="helloHolder">点我</button>
</div>

var vm = new Vue({
el: '#app',
methods: {
helloHolder(a, b, e) {
console.log(a);
console.log(b);
console.log(e);

        }
    }
})

结果:


解决: 在函数执行时,传入一个实际参数 $event 来代表事件对象

<div id="app">
<button v-on:click = "helloHandler"> 点击 </button>
<button @click = "helloHandler( 10,20,$event)"> 点击 </button>
</div>


var vm = new Vue({
el: '#app',
methods: {
helloHolder(a, b, e) {
console.log(a);
console.log(b);
console.log(e);
        }
    }
})


业务: 点击这个按钮,添加或删除一条新的数据放在列表数据中

<div id="app">
<ul>
<li v-for="item in lists" :key="item.id">
<p>{{ item.task }}</p>
</li>
</ul>
<button v-on:click="add">添加</button>
<button @click="remove">删除</button>
</div>

new Vue({
el: '#app',
data: {
lists: [{
id: 1,
task: '打球'
}, {
id: 2,
task: '跑步'
}]
},
methods: {
add() {
this.lists.push({// this 指代的是new出来的Vue对象
id: this.lists.length + 1,
task: '唱歌'
})
},
remove() {
this.lists.pop()
}
}


})

问题1: 下标是不能检测变动的,但是我们现在看到了它检测到了

<div id="app">
<ul>
<li v-for="item in lists" :key="item.id">
<p>{{ item.task }}</p>
</li>
</ul>
<button v-on:click="add">添加</button>
<button @click="remove">删除</button>
<button @click="indexHandle">修改第二条数据</button>


</div>

new Vue({
el: '#app',
data: {
lists: [{
id: 1,
task: '打球'
}, {
id: 2,
task: '跑步'
}]
},
methods: {
add() {
this.lists.push({
id: this.lists.length + 1,
task: '唱歌'
})
},
remove() {
this.lists.pop()
},
indexHandle() {
this.lists[1].task = '撸猫'
}
}


})



问题2: 如果我们通过 length = 0 , 来清空一个数组,那么vue检测不到这个变动

<div id="app">
<ul>
<li v-for="item in lists" :key="item.id">
<p>{{ item.task }}</p>
</li>
</ul>
<button v-on:click="add">添加</button>
<button @click="remove">删除</button>
<button @click="indexHandle">修改第二条数据</button>
<button @click="clearLists">清空列表</button>




</div>

new Vue({
el: '#app',
data: {
lists: [{
id: 1,
task: '打球'
}, {
id: 2,
task: '跑步'
}]
},
methods: {
add() {
this.lists.push({
id: this.lists.length + 1,
task: '唱歌'
})
},
remove() {
this.lists.pop()
},
indexHandle() {
this.lists[1].task = '撸猫'
},
clearLists() {
this.lists.length = 0
}
}

})



解决方法 : 使用splice

<div id="app">
<ul>
<li v-for="item in lists" :key="item.id">
<p>{{ item.task }}</p>
</li>
</ul>
<button v-on:click="add">添加</button>
<button @click="remove">删除</button>
<button @click="indexHandle">修改第二条数据</button>
<button @click="clearLists">清空列表</button>

</div>

new Vue({
el: '#app',
data: {
lists: [{
id: 1,
task: '打球'
}, {
id: 2,
task: '跑步'
}]
},
methods: {
add() {
this.lists.push({
id: this.lists.length + 1,
task: '唱歌'
})
},
remove() {
this.lists.pop()
},
indexHandle() {
this.lists[1].task = '撸猫'
},
clearLists() {
// this.lists.length = 0
this.lists.splice(0)
}
}


})


问题3: 我们直接修改一个数组下的一个数据时,发现下标不能检测变动了

<div id="app">
<ul>
<li v-for="item in lists" :key="item.id">
<p>{{ item.task }}</p>
</li>
<li v-for="item in array">
<p>{{item}}</p>
</li>
</ul>
<button v-on:click="add">添加</button>
<button @click="remove">删除</button>
<button @click="indexHandle">修改第二条数据</button>
<button @click="clearLists">清空列表</button>
<button @click="changeArray">改变数组</button>

</div>

new Vue({
el: '#app',
data: {
array: [1, 2, 3],
lists: [{
id: 1,
task: '打球'
}, {
id: 2,
task: '跑步'
}]
},
methods: {
add() {
this.lists.push({
id: this.lists.length + 1,
task: '唱歌'
})
},
remove() {
this.lists.pop()
},
indexHandle() {
this.lists[1].task = '撸猫'
},
clearLists() {
// this.lists.length = 0
this.lists.splice(0)
},
changeArray() {
this.array[1] = '你好'
}
}

})


解决方法: 使用 Vue.set / this.$set

<div id="app">
<ul>
<li v-for="item in lists" :key="item.id">
<p>{{ item.task }}</p>
</li>
<li v-for="item in array">
<p>{{item}}</p>
</li>
</ul>
<button v-on:click="add">添加</button>
<button @click="remove">删除</button>
<button @click="indexHandle">修改第二条数据</button>
<button @click="clearLists">清空列表</button>
<button @click="changeArray">改变数组</button>


</div>

new Vue({
el: '#app',
data: {
array: [1, 2, 3],
lists: [{
id: 1,
task: '打球'
}, {
id: 2,
task: '跑步'
}]
},
methods: {
add() {
this.lists.push({
id: this.lists.length + 1,
task: '唱歌'
})
},
remove() {
this.lists.pop()
},
indexHandle() {
this.lists[1].task = '撸猫'
},
clearLists() {
// this.lists.length = 0
this.lists.splice(0)
},
changeArray() {
// this.array[1] = '你好'
// this.$set(this.array, '1', '你好')
Vue.set(this.array, '1', '你好')
}
}


})


v-model 

双向数据绑定
默认绑定value值
v-model应用于表单元素

<div id="app">
<input type="text" v-model="msg">
<p>{{msg}}</p>
</div>

new Vue({
el: '#app',
data: {
msg: 'hello world'
}
})


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值