data与el的2种写法:

        1.el有两种写法

                (1).new Vue的时候配置el属性

                (2).先创建Vue实例,随后再通过v.$mount('#root')指定el的值

        2.data有2种写法

                (1).对象式

                (2).函数式

                如何选择:目前哪种写法都可以,以后学习到组件的时候,data必须使用函数式,否则会报错。

        3.一个重要的原则:

                由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。

el的两种写法

我们先把el注释掉,然后打印出Vue返回的实例对象,看看有些啥

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="root">
<h1>{{name}}</h1>
</div>

</body>

<script>
Vue.config.productionTip = false;
const v = new Vue({
// el: '#root',
data: {
name:'hello'
}
})

console.log(v);
</script>

</html>

执行结果:

8.el与data的两种写法_javascript

        我们可以看到控制台输出了很多的属性和方法,但是有一类属性和方法很特殊,他们都是以$开头的。那么所有红框里的东西,都是Vue为程序员准备好的,而下面拿下不带$的都不是给程序员用的,而是Vue自身的底层在使用。

        我们输出的是Vue的实例对象,红框里的所有东西,都是Vue实例对象自身的。而我们接下来

要用的在实例创造者的原型对象上

8.el与data的两种写法_javascript_02

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="root">
<h1>{{name}}</h1>
</div>

</body>

<script>
Vue.config.productionTip = false;
const v = new Vue({
// el: '#root',
data: {
name:'hello'
}
})

console.log(v);
v.$mount('#root')
</script>

</html>

 执行效果:

8.el与data的两种写法_html5_03

我们可以看到使用v.$mount('#root')也可以实现和el一样的效果。那么这两种方式我们使用哪种都可以,只不过第二种会更灵活一点。我们可以再对数据进行完一系列的处理之后,再将数据挂载到容器上,而不是一开始就直接使用el绑定好。

data的两种写法

我们之前写的data都是写成json对象的形式,那就是我们的第一种写法

其实还有一种写法叫函数式。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器 -->
<div id="root">
<h1>{{name}}</h1>
</div>

</body>

<script>
Vue.config.productionTip = false;
// const v = new Vue({
// // el: '#root',
// data: {
// name:'hello'
// }
// })

// console.log(v);
// v.$mount('#root')

new Vue({
el: '#root',
//data的第一种写法,对象式
/* data: {
name:'hello'
} */

//data的第二种写法:函数式
data:function(){
return{
name:'hello'
}
}
})
</script>

</html>

我们看到第二种写法之后肯定会想,还是第一种简单,以后都用第一种好了

但是这里我们就得说一下,像上面el的两种写法真的是哪种都可以用,但是data的两种写法,我们这里要注意等以后我们学习到组件的时候,必须使用这种麻烦的函数式,而不能使用对象式。

接下来我们看一下第二种写法中的this对象是什么?我们打印一下

new Vue({
el: '#root',
//data的第一种写法,对象式
/* data: {
name:'hello'
} */

//data的第二种写法:函数式
data:function(){
console.log(this);
return{
name:'hello'
}
}
})

8.el与data的两种写法_html_04

我们可以看到这里打印出的是Vue实例对象。

这里我们要注意,这个this对象是Vue实例对象的前提是建立在这个函数是普通函数。

如果我们使用箭头函数,我们可以看一下:

new Vue({
el: '#root',
//data的第一种写法,对象式
/* data: {
name:'hello'
} */

//data的第二种写法:函数式
data:()=>{
console.log(this);
return{
name:'hello'
}
}
})

8.el与data的两种写法_html_05

 我们可以看到this对象变成了全局的window,这是因为箭头函数没有自己的this就会往外找,从而找到了全局的window。

所以我们就要注意,我们在用data的第二种写法的时候,一定要用普通函数。

下面这样的写法也是普通函数:

new Vue({
el: '#root',
//data的第一种写法,对象式
/* data: {
name:'hello'
} */

//data的第二种写法:函数式
data(){
console.log(this);
return{
name:'hello'
}
}
})