一、引入Vue
xml
<head>
<title>初识Vue</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
二、准备好一个容器
2.1 为什么需要准备好一个容器
(1)之所以使用
Vue
,是需要Vue
帮助我们构建用户界面。(2)有一天,
Vue
构建出来界面了,但是界面摆放在什么位置呢?我们需要告诉Vue
,界面摆放在这里,准备好一个容器,承接Vue的工作成果
。(3)认识其他框架,其实
<div id="root"></div>
很熟悉
2.2 编写代码在死容器里面
xml
<div id="root">
<h1>按照常理分析,里面不应该写东西,准备好一个容器就行。</h1>
<h1>全是写死的,死数据</h1>
<h1>至于里面有什么内容,看Vue怎么工作的。</h1>
<h1>如果这样写,Vue其实并没有工作。</h1>
<h1>浏览器中开发者工具灯不会亮,Vue不承认在该页面中使用到了Vue。</h1>
<h1>没有写出能够让Vue工作的代码</h1>
</div>
2.3 控制台报错
HTTP
的状态码是404
favicon.ico``网站的页签图标
、网站的偏爱图标资源
找不到。
浏览器打开任何一个网站时,都会默认请求 页签图标,这里没有,就报404错误
。
问题:浏览器找哪里要的页签图标?
(1)点击
Network
(2)强制刷新:
Shift
+点击左上角刷新按钮 。正常刷新会怎么样?正常刷新Network
里面的数据都没有了,请求一次发现没有,就不再请求了。(3)只有强制刷新才会出现
favicon.icon
5500服务器
哪里来的?
(1)没有写过代码开这台服务器
(2)
VS Code
中插件Live Server
,鼠标在VS Code
编辑器中右键选择Open with Live Server
,会在本机5500端口号
上开一台内置的小服务器,把整个工程里面所有的文件和文件夹都作为这台服务器的根资源去使用。
直接找5500服务器
要东西,你看他给你的是什么?
三、创建Vue实例
3.1 构造函数解析
引入vue.js
文件后,全局多了一个构造函数
。
arduino
// 调整整体的Vue的配置
Vue.config.productionTip = false;//阻止Vue在启动时生成的生产提示
// 先调整Vue,后使用Vue
// 按照习惯,总喜欢在一个实例对象出现时,拿一个变量去接
// const x = new Vue() x是MVVM中的VM
// 构造函数中只传一个参数,参数的类型是对象,该对象叫做配置对象
const x = new Vue({})
一说配置对象,马上就得反应出来下列东西:
rust
// 想要使用axios发请求,也要发送配置对象
axios({
// 配置对象中第一组配置
url:'http://具体给哪里发请求',
ura:'http://ura人家不认识,key是不能随便改的',
url:'http://值可以换地址',
url:999,//配置对象的value值,数据类型是不能随便更改的,得用人家指定的那几种
})
3.2 el
配置项
el
是element
元素的简称。 el:'#root'
中#root
是容器中的CSS
的ID选择器
,通过这个选择器,找到了这个容器。el
用于指定当前Vue实例
为哪个容器服务,值通常为CSS选择器字符串
,可以是id选择器
,也可以是class选择器
。
还可以像下面这种写法,
javascript
el:'#root',//给一个选择器自己找去。精简推荐。
el:'.root',//使用类选择器也是可以的。
el: document.getElementById('root'),//亲自找到这个元素配置到el中。复杂不推荐。
3.3 data
配置项
把容器里面变化的数据 交给Vue
实例保管。
在Vue实例
中通过data配置项
,把变化的数据保存在data配置项
中,然后通过插值表达式
等办法 ,从data配置项
中把变化的数据拿出来,放到模板中进行渲染。
表面上比较麻烦,但是当数据变化时,就会很简单了。以后需要修改这个数据,直接修改data配置项
中的数据,页面中使用到这个数据的地方,自动就发生变化了。
只需要把数据维护好,用到数据的地方自然而然就发生变化了,省去了自己操作DOM
。
data
本质上就有"数据"的意思。存储的数据类型是什么呢?如果和el
一样,存储字符串类型会怎么样呢?
xml
<body>
<div id="root">
<h1>Hello,{{msg}}</h1>
<!-- 换了数据就比较麻烦 -->
<h1>Hello,中国</h1>
</div>
<script>
Vue.config.productionTip = false;
const vm = new Vue({
el: '#root',
data: 'World'
})
</script>
</body>
写成一个对象:
data
中用于存储数据,数据供el
所指定的容器去使用。
xml
<body>
<div id="root">
<!-- 插值语法:插入一个值,插值表达式 -->
<h1>Hello,{{school}}</h1>
<!-- 当年设计出来就是{{}} -->
<!-- <h1>Hello,**msg**</h1> -->
</div>
<!-- 写到这里是看不到的。容器之外的东西Vue实例是管不了的。 -->
<h2>{{schoolNum}}</h2>
<script>
Vue.config.productionTip = false;
new Vue({
el: '#root',
// data值暂时先写成一个对象,以后写成对象,可能就玩不下去了。
// 讲到组件时,data应该写为一个函数。
data: {
school: '世界',
schoolNum: 3000
}
})
</script>
</body>
展示效果:
3.4 总结
(1)想让Vue
工作,就必须创建一个Vue实例
,且要传入一个配置对象。现在只有el配置项
和data配置项
。
(2)root容器
里的代码依然符合html规范
,只不过混入了一些特殊的Vue语法
。例如:<pre>Hello,{{school}}</pre>
(3)root容器
里的代码被称为Vue模板
。解析流程如下:
先有容器,然后有Vue实例
,当Vue实例
开始工作时,发现写了el:'#root'
配置,Vue实例
知道了,然后把整个容器都拿过来放到Vue实例
中,进行解析,进行扫描,有没有自己设计的特殊语法,如果扫描到了,就把data
配置项中的value
值,把root
容器中有的Vue
语法,全部替换掉了,然后生成一个全新的root
容器,最后再把解析完的root
容器,重新放到页面上,替换掉刚才的整个容器。一旦把动态的数据交给Vue实例
,以后把动态数据更改了内容,在页面中,只要使用到动态数据的地方,就会自动更新,不用自己去操作DOM
了。
模板经过解析,就变成一个正常的html片段
。
(4)容器两个作用
作用1:为Vue
提供模板
作用2:把Vue
的工作成果知道往哪里放
3.5 如果页面上有两个容器
(1)一个Vue实例
不能同时接管两个容器
xml
<body>
<!-- 第一个容器:DOM结构在前,有人解析 -->
<div class="app">
<h1>Hello,{{name}}!</h1>
</div>
<!-- 第二个容器:DOM结构在后 -->
<div class="app">
<!-- 没有解析,控制台不会报错,无人解析 -->
<h1>Hello,{{name}}!</h1>
</div>
<script src="./js/vue.js"></script>
<script>
const root = new Vue({
el: '.app',
data: {
name: '邓为'
}
})
</script>
</body>
效果展示:
(2)多个Vue实例
不能同时接管一个容器
xml
<body>
<div class="app">
<h1>Hello,{{name}},{{sex}}</h1>
</div>
<script src="./js/vue.js"></script>
<script>
// 第一个Vue实例:负责第一个容器
const root = new Vue({
el: '.app',
data: {
name: '邓为'
}
})
// 第二个Vue实例:已经有上面的Vue实例接管了,这里的代码依旧执行,但是没有任何意义。
new Vue({
el: '.app',
data: {
sex: '男'
}
})
</script>
</body>
效果展示:
(3)一个容器只能被一个Vue实例
接管,容器和Vue实例
之间的关系是一 一 对应的关系。
xml
<body>
<div class="app1">
<h1>Hello,{{name}},{{sex}}</h1>
</div>
<div class="app2">
<h1>Hello,{{name}},{{sex}}</h1>
<!-- 获取当前时间的时间戳格式 -->
<h1>{{Date.now()}}</h1>
</div>
<script src="./js/vue.js"></script>
<script>
const root = new Vue({
el: '.app1',
data: {
name: '邓为'
}
})
new Vue({
el: '.app2',
data: {
sex: '男'
}
})
</script>
</body>
效果展示:
3.6 插值表达式的规范
插值表达式
里面的内容必须写成JS表达式
。
JS表达式
就是一种JS语句
,JS语句也称为JS代码
。
注意区分:JS表达式和JS代码(语句)
JS
表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方。例如:(1) 变量
a
------>把a
写到任何一个地方,就会读取a
这个变量,拿到a
这个变量所存储的值使用。(2)
a + b
------>加法运算表达式(3)
demo(1)
------>函数调用表达式。函数调用了一定会有返回值的。程序员如果不写return
,返回值为undefined
,undefined
也是基本类型之一。(4)
x === y ? 'a' : 'b'
---------->三元(目)表达式总结:使用一个变量在左侧接收,
const x =
可以接到一个值。
JS
代码【语句】(1)
if(){}
---------判断语句。控制走不走。(2)
for(){}
---------循环语句。控制走几次。总结:这些东西不生成值,只是控制代码的走向。
3.7 使用Vue开发者工具
xml
<body>
<div id="root">
<pre>小写表示:{{school}}</pre>
<!-- 函数调用表达式 -->
<pre>大写表示:{{school.toUpperCase()}}</pre>
</div>
<script>
Vue.config.productionTip = false;
new Vue({
el: '#root',
data: {
school: 'world'
}
})
</script>
</body>
3.8 总结
1、想让
Vue
工作,就必须创建一个Vue实例
,且要传入一个配置对象2、
root容器
里的代码依然符合html规范
,只不过混入了一些特殊的Vue语法
3、
root容器
里的代码被称为Vue模板
4、
Vue实例
和容器是一一对应的关系5、真实开发中
只有
一个Vue实例
,并且会配合着组件
一起使用6、
{{xxx}}
中的xxx
要写js表达式
,不能写成判断或循环,且xxx
可以自动读取到data
中所有属性,是Vue源码
的底层已经做好的了,所以data
中定义动态数据,就可以在Vue模板
中使用动态数据。7、一旦
data
中的数据发生改变,那么模板【页面】中用到该数据的地方也会自动更新。模板改变了,就会重新解析,解析完成后,重新放到页面上,页面就会发生改变,最终
影响的是页面
。
3.9 如果引用生产版本的Vue
(1)假设没有使用new
关键字,去调用Vue({})
,如果引用开发版本的Vue
,控制台会报错:
(2)如果引用的是生产版本的Vue
,就会导致刚才程序员看到的良好的提示信息没有
了,直接报底层
错误,很不友好。所以,开发的时候,一定要引入开发版本的Vue
。
(3)为什么一定要使用new
关键字,才能写该构造函数呢?
这是Vue
的规矩,不用不行,Vue底层
写了一个校验,校验Vue
里面的this
是不是实例对象。
可以查看vue.js
的源码:
javascript
//定义了一个vue的构造函数
function Vue(options) {
//如果这个function里面的this不是Vue实例里面的实例对象,就报如下错误
//如果不使用new关键字调用vue,那么这个Vue里面的this就不可能是实例对象
if (!(this instanceof Vue)) {
//刚才看到的提示信息:Vue是一个构造寒素,应该使用new关键字去调用,我们可以进行更改
warn$2('Vue is a constructor and should be called with the `new` keyword');
warn$2('你干什么呢?怎么没有使用new关键字呢?');
}
this._init(options);
}