angular 09年,年份较早,一开始大家是拒绝
react 2013年, 用户体验好,直接拉到一堆粉丝
vue 2014年, 用户体验好
在为AngularJS工作之后,Vue的作者尤雨溪开发出了这一框架。他声称自己的思路是提取Angular中为自己所喜欢的部分,构建出一款相当轻量的框架。[8]Vue最早发布于2014年2月。作者在Hacker News、Echo JS与Reddit的*/r/javascript*版块[9]发布了最早的版本。一天之内,Vue就登上了这三个网站的首页。[10]Vue是Github上最受欢迎的开源项目之一。同时,在JavaScript框架/函数库中,Vue所获得的星标数已超过React,并高于Backbone.js、Angular 2、jQuery等项目。
我们的网站变得更加强大,多亏了有JavaScript,我们已经把很多的传统服务端代码放到了浏览器中,这样就产生了成千上万行的JavaScript代码,它们连接了各式各样的HTML 和css文件,但缺乏正规的组织形式。这也是为什么越来越多的开发者使用JavaScript框架,诸如 Angular,react,vue这样的,Vue是一款友好的,多用途且高性能的JavaScrip框架,它能够帮助你创建 可维护性和可测试性更强的代码库,Vue是渐进式的javaScript框架,也就是说,如果你已经有一个现满足你的各式需求,和其他前端框架一样,Vue允许你将一个网页分割成可复用的组件,每个组件都包含属于自己的HTML,CSS,JavaScript以来渲染网页中相应的地方。接下来我们就亲自动手感受一下Vue,构建一个商品库存的页面。介绍一些核心概念,正是这些东西让Vue如此实用,
和许多Javascript应用一样,我们从网页中需要展示的数据开始:
使用Vue的起步非常简单:
我们引入Vue的库,创建一个vue的实例,
然后通过应用的ID嵌入到我们的根元素中,
el:是元素element的缩写,
我们还要将数据放入一个对象,
并且将X 修改为一个表达式,用双大括号括起来,
如你所见,它已经工作起来了,在页面中已经渲染出来了。
在页面中显示内容为:Boots are in stock.
<div id="app">
//X are in stock.
<h2> {
{
product }} are in stock.</h2>
</div>
<script src ="https://unpkg.com/vue"></script>
<script>
const app= new Vue({
el:'#app',
data:{
product:'Boots'
}
})
var product = 'Boots'
</script>
很酷,上面的界面已经渲染出来了,但是
Vue的魔力在数据变更时才会出现:
如果我们打开控制台,在console那里输入,
改变product的值:app.product = 'Socks'
注意在product的值改变的同时,Vue会自动更新了我们的HTML,见图一
这是因为Vue是响应式的,也就是说当我们的数据变更时,Reactive,
vue会帮你更新所有,网页中用到它的地方,除了字符串 vue对其它类型的数据也是如此,
现在我们修改
所以我们把上面的data中的,简单的商品字符串格式,变成一个商品数组试试看:
然后我们将标签:<h2> 改为一个无序列表,再为数组中的每个商品,创建一个列表项,使用Vue的V-for指令,让每个商品都拥有各自的列表项,
如你所看到的,就会出现列表了。
<div id="app">
//X are in stock.
// {
{ product }} are in stock.
<ul>
<li v-for="product in products"></li>
</ul>
</div>
<script src ="https://unpkg.com/vue"></script>
<script>
const app= new Vue({
el:'#app',
data:{
// product:'Boots'
product:[
'Boots',
'Jacket',
'Hiking Socks'
]
}
})
var product = 'Boots'
</script>
不过这还不够有说服力:
现在我们先从空列表开始:然后从一个实际的API获取我们的商品信息,
这个API 是从某个数据库获取来的,
当应用被创建时,我们会从这个API获取最新的商品信息,
这就是你要从这里获取的全部
我们获取商品列表,并把它们更新到数据中
这样,如你所看到的,在我们网页中,
各项表项展示了该API返回的对象:
好吧,这还不是常人能读懂的样子,所以我们来改变一下它的展示方式
<div id="app">
<ul>
<li v-for="product in products"></li>
</ul>
</div>
<script src ="https://unpkg.com/vue"></script>
<script>
const app= new Vue({
el:'#app',
data:{
// product:'Boots'
product:[ ]
},
created (){
// 这个API 是从某个数据库获取来的,
fetch('https://api.myjson.com/bins/74l63')
.then(response =>response.json())
.then(json =>{
//我们获取商品列表,并把它们更新到数据中
this.products = json.products
})
}
})
var product = 'Boots'
</script>
好吧,这还不是常人能读懂的样子,所以我们来改变一下它的展示方式,
我们将打印出其数量和名称,下面修改后,好了,这样打印出来的效果非常好:
<div id="app">
<ul>
<li v-for="product in products">
{
{
product.quantity}} {
{
product.name}}
</li>
</ul>
</div>
<script src ="https://unpkg.com/vue"></script>
<script>
const app= new Vue({
el:'#app',
data:{
// product:'Boots'
product:[ ]
},
created (){
// 这个API 是从某个数据库获取来的,
fetch('https://api.myjson.com/bins/74l63')
.then(response =>response.json())
.then(json =>{
//我们获取商品列表,并把它们更新到数据中
this.products = json.products
})
}
})
var product = 'Boots'
</script>
我们可能需要特别留意,数量为零的项目:
所以我们添加一个 <SPAN>
写入文字 OUT OF OF STOCK (out of stock 已没货,没库存(s do k))
这个区域会在项目数量为零的时候出现
这里我们用到了 v-if 指令
因为我们的JACKET 数量为零,它卖完了
<div id="app">
<ul>
<li v-for="product in products">
{
{
product.quantity}} {
{
product.name}}
<span v-if="product.quantity === 0">
- OUT OF STOCK
</span>
</li>
</ul>
</div>
<script src ="https://unpkg.com/vue"></script>
<script>
const app= new Vue({
el:'#app',
data:{
// product:'Boots'
product:[ ]
},
created (){
fetch('https://api.myjson.com/bins/74l63')
.then(response =>response.json())
.then(json =>{
this.products = json.products
})
}
})
var product = 'Boots'
</script>
如果我们想要打印出
列表中商品的总数该怎么办:
我们需要创建一个名为TOTALPRODUCTS 的计算属性,
它会返回我们所有商品的数量总和,
也许你对JavaScript的 reduce 不熟悉,它在这里用来把每个商品的数量加在一起
如你所看到的, 在我们的浏览器中,
它已经把总数量准确的加起来了
<div id="app">
<ul>
<li v-for="product in products">
{
{
product.quantity}} {
{
product.name}}
<span v-if="product.quantity === 0">
- OUT OF STOCK
</span>
</li>
</ul>
<h2>Total Inventory:{
{
totalProducts }}</h2>
</div>
<script src ="https://unpkg.com/vue"></script>
<script>
const app= new Vue({
el:'#app',
data:{
product:[ ]
},
computed:{
totalProducts(){
return this.products.reduce((sum,product) =>{
return sum + product.quantity
})
}
}
created (){
fetch('https://api.myjson.com/bins/74l63')
.then(response =>response.json())
.then(json =>{
this.products = json.products
})
}
})
var product = 'Boots'
</script>
现在我将要在浏览器中像你展示:Vue的chrome 插件,
03:47 分
jquery 库 -> DOM(操作DOM) + 请求
art-template 库 -> 模板引擎
框架 = 全方位功能齐全
KFC的世界里,库就是一个小套餐, 框架就是全家桶
代码上的不同
1:引包
2:启动 new Vue({el:目的地,template:模板内容});
options
目的地 el
内容 template
数据 data 保存数据属性
数据驱动视图
{ { 表达式 }}
可以用于页面中简单粗暴的调试
注意: 必须在data这个函数中返回的对象中声明
在vue中提供了一些对于页面 + 数据的更为方便的输出,这些操作就叫做指令, 以v-xxx表示
比如在angular中 以ng-xxx开头的就叫做指令
在vue中 以v-xxx开头的就叫做指令
指令中封装了一些DOM行为, 结合属性作为一个暗号, 暗号有对应的值,根据不同的值,框架会进行相关DOM操作的绑定
v-text 只能用在双标签中
v-text 其实就是给元素的innerText赋值
v-html 其实就是给元素的innerHTML赋值
v-if 如果值为false,会留下一个<!---->作为标记,万一未来v-if的值是true了,就在这里插入元素
如果有if和else就不需要单独留坑了
如果全用上 v-if 相邻v-else-if 相邻 v-else 否则 v-else-if可以不用
v-if和v-else-if都有等于对应的值,而v-else直接写
v-if家族都是对元素进行插入和移除的操作
v-show是显示与否的问题
注意: 指令其实就是利用属性作为标识符,简化DOM操作,
看:v-model="xxx"
v-model 代表要做什么 xxx代表针对的js内存对象
写在那个元素上,就对哪个元素操作
v-if:标签显示或不显示
v-else:
v-else-if:
v-show:隐藏、显示
v-bind:强制数据绑定
v-model:双向数据绑定
v-for:遍历
v-on:绑定事件监听
v-if
是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if
也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show
就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
一般来说,v-if
有更高的切换开销,而 v-show
有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show
较好;如果在运行时条件很少改变,则使用 v-if
较好。
给元素的属性赋值
语法 在元素上 v-bind:属性名="常量||变量名"
简写形式 :属性名="变量名"
<div v-bind:原属性名="变量">div>
<div :属性名="变量">
div>
v-on:事件名="表达式||函数名"
@事件名="表达式"
input v-model="name"
input :value="name"
v-for="item in arr"
v-for="item in obj"
v-for="(item,index) in arr" :class="index"
渲染组件-父使用子组件
var Header = { template:'模板' , data是一个函数,methods:功能,components:子组件们 }
components:{ 组件名:组件对象 }
<组件名>组件名>
总结父传子
###1.6.2注册全局组件
Vue.component('组件名',组件对象);
filters:{ 过滤器名:过滤器fn }
最终fn内通过return产出最终的数据{ { 原有数据 | 过滤器名 }}
function(data,argv1,argv2...){}
{ { 数据 | 过滤器名(参数1,参数2) }}
npm init -y
npm install [email protected] --save-dev --registry https://registry.npm.taobao.org
"scripts": { "test": "webpack ./main.js ./build.js" },
npm run test
fn3() {
//干掉了:function,用在对象的属性中
console.log(this);
},
<son v-for="(item,index) in persons" :key="index" >son>
activated(){
//激活的 keep-alive v-if="true"
console.log('activated')
},
deactivated(){
//停用的 keep-alive v-if="false"
console.log('deactivated')
},
beforeDestroy(){
//销毁前 v-if="false"
console.log('beforeDestroy')
},
destroyed(){
//销毁后 v-if="false"
console.log('destroyed')
},
$el 是拿其DOM
这个对象就相当于我们平时玩的this,也可以直接调用函数
总结:
* Vue是一个渐进式的JS框架
* 渐进式:本身实现的功能有限,只要引入相关的包或者是插件,就可以实现更多的功能
* Vue借鉴了React和angular
* Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。
*
*
* MVVM
* M:model----数据模型
* V:-----视图
* VM:----Vue的实例对象
* 数据发生改变,视图会发生相应的变化,中间是通过Vue的实例来完成的
*
* Vue开发(编写代码)
* 步骤(流程):
* 1.安装Vue相关的包(相关的文件)
* 2.安装三种方式:
* 1) - 直接通过BootCDN引入
* 在线方式
* <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
* 2) - 直接下载Vue的相关文件,引入vue.js文件
* 在www.github.com中搜索Vue,然后找到对应的相关的文件,找master分支,直接下载压缩包
* 在该压缩包中找dist目录,里面找vue.js文件,直接在自己的开发的html文件中引入即可
* 3) - 下载脚手架的方式,直接可以在内部进行Vue的相关的开发(2的版本和3的版本)
*
*
* DHTML----动态页面
写容器:el
写数据:data
写监听:watch
写方法:methods
计算属性:computed