1.创建一个Vue实例
通过vue函数创建一个新的vue实例
一个vue应用由一个通过new vue
创建的根Vue实例,以及可嵌套的、可复用的组件树组成。
Vue的基本使用:
<div id="app">
<!-- {{ 插值表达式,可以赋值 取值 三元 }} -->
{{ msg }}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
// 引入vue后 会白给你一个Vue构造函数
let vm = new Vue({ // 配置对象
el: '#app', // 告诉vue能管理那个部分,使用的是querySelector
data: { // data中的数据会被vm所代理
msg: 'hello world', // 可以通过vm.msg取到对应的内容 ,也可以赋值
}
})
</script>
2.声明式渲染
Vue.js的核心是一个允许采用简洁的模板语法来声明式地将数据渲染近DOM的系统
2.1 关于{{}} 插值表达式
插值表达式,表达式,赋值运算,计算,三元表达式,但是尽量少在写逻辑计算
插值
<!-- HTML --->
<div id="app">
{{ message }}
</div>
<!-- JS --->
<script>
new Vue({
el: '#app',
data: {
messgae: 'hello Vue!'
}
})
</script>
我们已经成功创建了第一个 Vue 应用!看起来这跟渲染一个字符串模板非常类似,但是 Vue 在背后做了大量工作。现在数据和 DOM 已经被建立了关联,所有东西都是响应式的。我们要怎么确认呢?
如何确定现在的数据已经和DOM建立了关联,变成响应式的呢
将js中的new Vue 复制给一个全局变量app.此时app就是Vue实例化对象,未来可能会用它来搞很多事情,但是最常用到它的时候,是通过this关键字来使用它
var app = new Vue({
el: '#app',
data: {
messgae: 'hello Vue!'
}
})
然后在浏览器的js控制台中修改app.message值,同时页面也会发生改变
在控制台中输入
app.messge = "你好,Vue"
2.2 使用JavaScript表达式
迄今为止,在我们的模板中,我们一直都只绑定简单的属性键值。但实际上,对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id"></div>
这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。
示例:
<div id="app">
<!-- 数字操作 -->
<p>{{ number + 2 }}</p>
<!-- 三目运算 -->
<p>{{ ok ? 'YES' : 'NO' }}</p>
<!-- 字符串翻转 -->
<p>{{ message.split('').reverse().join('') }}</p>
</div>
<script>
const vm = new Vue({
el: "#app",
data: {
message: 'Hello World',
number: 10,
ok: true,
}
})
</script>
显示结果:
但是有个限制就是,每个绑定双大括号(Mustache语法)里面都只能包含单个表达式
2.3 关于打他数据
vue关注的是数据变化,不需要在像以前一样关注DOM的变化
比如我想在2秒之后让页面发生变化,我们只需要在2秒后更改数据就可以了
var vm = new Vue({
el:'#app',
data:{
msg:'hello world'
}
})
setTimeout(function(){
vm.$data.msg = "bye world"
},2000)
关于实例介绍:
- 实例中
vm
是vue
的实例对象 - 实例对象上有
$data
属性,其值就是选项对象中data
属性值 - 选项对象就是在实例化
Vue
时传入的对象
4.data
属性值是一个对象,因此$data
也就是这个对象
5.当通过$data
修改msg
的值时,也就等于改data
中的值, 对应是引用类型
因此示例的结果就是:
2秒后data
数据中msg
的值改变了, 又因为Vue
是始终在关注着msg
这个数据,一旦数据发生变化,就会触发Vue
的响应式, 继而改变视图显示
Vue实例对象就是vm, data数据就是model, 页面显示的结果就是view
这张图在配合刚才的示例, 我们就能很好的理解,当数据Model发生变化以后, Vue就可以通过Data Bindings了解到,然后使用新的数据去改变页面显示
3.实例上的方法
除了数据属性,Vue 选项对象中还暴露了一些有用的属性与方法。在通过实例对象使用选项对象的属性时,属性前面都需要带上前缀 $,以便与用户定义的属性区分开来。例如:
var data = { a: 1 }
var vm = new Vue({
el: '#example',
data: data
})
vm.$data === data // => true
vm.$el === document.getElementById('example') // => true
3.1实例上常用的属性方法
vm.$attrs // 用户获取父组件传递给子组件的属性,(除props,class,style外)
vm.$data // vm 上的数据
vm.$watch // 监听
vm.$el // 当前el元素
vm.$set // 后加的属性实现响应式
vm.$options // vm 配置 上的 所有属性
vm.$nextTick(()=>{}) // 异步方法,等待渲染dom完成后来获取vm
vm.$refs // 获取dom元素或者组件实例的引用
其实我们可以创建一个Vue实例,然后在控制台上打印这个实例对象,你会看到很多的属性和方法
const vm = new Vue({
el: "#app",
})
在控制台输入vm
显示结果:
4实例化多个vue
我们可以在页面上同时实例化多个Vue, 不同的实例接管页面上不同的区域.
看下如下的示例:
<h1> 实例化多个Vue对象 </h1>
<div id="app-one">
<h2>{{ title }}</h2>
<p>{{ greet }}</p>
</div>
<div id="app-two">
<h2>{{ title }}</h2>
<p>{{ greet }}</p>
<button v-on:click = "changeTitle">点击改变app-one的h2的内容</button>
</div>
<script>
// Vue实例
var one = new Vue({
el: '#app-one',
data: {
title:" vue-app-one的内容"
},
computed: {
greet: function(){
return "Hello App One"
}
}
})
// Vue实例
var two = new Vue({
el: '#app-two',
data: {
title:" vue-app-two的内容"
},
methods: {
changeTitle: function(){
one.title = "app-one的内容发生改变了"
}
},
computed: {
greet: function(){
return "Hello App two"
}
}
})
</script>
Vue事件和方法还没有讲到, 先做一个了解即可:
示例分析:
- 两个实例
one
和two
接管了不同的DOM元素 - 点击按钮是在
two
实例接管的DOM元素中 - 所以,当你点击时只触发
two
实例中的方法,也只会改变two
实例中的数据
那么问题来了?
能否在two
实例中修改one
实例中的数据呢,?
答案当然是可以的啦, 因为变量one是全局变量,
在two实例化中,就可以通过one变量得到第一个Vue实例化对象,
然后就可以通过实例化对象修改数据,这个可以自己尝试写写.
5.Vue操作DOM元素
虽然Vue是数据驱动的,但是有的时候我们就需要自己手动的获取到DOM元素,对DOM元素进行操作。
操作DOM元素:
- 在需要操作的DOM元素中使用ref属性,
- ref属性的值是自己随便定义的名字
- 通过Vue实例的$refs属性获取操作dom元素
<div id="app">
<div ref="hello">你好</div>
</div>
<script>
var vm = new Vue({ // 根实例
el: '#app',
data: {
},
mounted() {
//dom元素中有多个一样的ref,dom如果不是通过v-for循环出来的,只能获取一个
// 如果是循环出来的,可以获取多个,获取的是一个数组
console.log(this.$refs.hello)
}
});
</script>
关于示例中$refs
属性的解释:
- 因为可以在多个DOM元素上使用ref.
- 所以
$refs
属性获取的是所有具有ref属性的DOM元素的集. - 因此要想操作确定的DOM元素就需要在通过当初的ref值获取.
简而言之: 就是ref在dom元素上通过this.$refs.自定义名字
是获取dom元素
当获取到DOM元素后,然后就可以采用原生的JavaScript对DOM进行操作
Vue 接管的DOM元素之外的元素使用ref是获取不了的,值是undefined