vue.js 起源

vue.js 的作者是尤雨溪,是一名中国人,之前在谷歌工作,现在在全职维护 vue 项目。

vue.js 是 2014 年推出来的。现在已经更新到 2.x 版本,3.0 版本会在 2020 年第 1 季度推出。

vue.js 借鉴了 mvvm 思想,采用单向数据流,使得数据流更加清晰易懂。

小贴示:什么是 MVVM?

MVC 架构

MVVM 架构

最常见的就是 mvc 架构,由模型、视图、控制器组成。mvvm 模式由模型、视图、视图模型组成。mvvm 模式的优点是便于复杂的逻辑解耦。开发者只需要关注业务逻辑,不需要手动操作 dom,不需要关注数据状态的同步问题,复数的数据状态维护全部交由 mvvm 统一管理即可。

vue.js 特性

  • 响应式

vue.js 渲染到 html 中的数据是响应式的。可以理解为 html 中展示的数据是 vue.js 定义的数据一个引用,而不是拷贝,当修改 vue.js 定义的数据时,html 自动响应更新显示。vue.js 框架给 js 和 html 页面建立起一座隐形的桥梁以响应并更新数据。

  • 组件化

vue.js 组件将要复用的通用性功能进行封装,便于大型项目的开发,也便于项目的功能性拆解。符合 D.R.Y. 原则。

  • 向下扩展

vue.js 和基于 jquery 的站点进行整合比较方便,只需要花一上午看下 [官方教程](
https://cn.vuejs.org/v2/guide/installation.html) 的基础章节就可以写起来了。

  • 性能

React 和 Vue 都是非常快的,所以速度并不是在它们之中做选择的决定性因素。对于具体的数据表现,可以移步这个[第三方 benchmark](https://stefankrause.net/js-frameworks-benchmark8/table.html),它专注于渲染/更新非常简单的组件树的真实性能。

vue.js 基础

1. 创建 vue.js 实例

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

el 表示 vue.js 实例挂载到的 dom 元素

data 是 vue.js 实例的数据对象,可响应数据变化

2. 数据绑定

<div id="app">{{ message }}</div>

3. 条件渲染

<h1 v-if="isRainy">下雨了</h1>
<h1 v-else>天晴了</h1>

4. 列表渲染

new Vue({
data: {
list: [
{message: '西红柿'},
{message: '苹果'},
{message: '梨子'},
],
}
});
<ul>
<li v-for="item in list">{{ item.message }}</li>
</ul>

5. 计算属性

new Vue({
computed: {
listLen: function() {
return this.list.length;
}
}
});

computed 用来定义计算属性,它是根据 vue.js 数据属性(``data``)计算而来的属性,它也可以响应式更新。

6. Class 绑定

<span v-bind:class="{isdone: isDone}">学习vue.js</span>

上面表示,当 isDone 这个 vue.js 实例的数据属性为真时,span 元素上就有一个名为 isdone 的 css class。

7. 事件处理

<button type="button" v-on:click="del">删除</button>

上面表示,监听 button 元素的 click 事件,处理方法是 del。

8. 表单输入绑定

<input type="text" v-model="text">

v-model 在表单元素上创建双向数据绑定。即修改上面输入框的值,会同步更新到 vue.js 实例的 text 数据对象;直接修改 vue.js 实例的 text 数据对象,也会同时反应到输入框上来。

vue.js 实战 todo list

一、创建 vue.js 实例

var vue = new Vue({
el: '#app',
data: {
text: '',
list: [
{text: '待办第1点', done: false},
{text: '待办第2点', done: false},
{text: '待办第3点', done: false},
],
},
methods: {
add: function() {},
finish: function() {},
unfinish: function() {},
del: function() {},
},
computed: {
todoNum: function() {},
finishNum: function() {},
}
})

二、创建 html 页面

<div id="app">
<input type="text" placeholder="待办事项" v-model="text">
<button type="button" v-on:click="add">增加</button> <ul>
<li v-for="item in list">
<span>{{ item.text }}</span>
<button type="button" v-on:click="unfinish(item)" v-if="item.done">未完成</button>
<button type="button" v-on:click="finish(item)" v-else>已完成</button>
<button type="button" v-on:click="del(item)">删除</button>
</li>
</ul>
</div>

截图:

三、增加按钮功能

methods: {
add: function() {
if (!this.text.replace(/\s/g, '')) {
alert('请输入内容');
return false;
}
this.list.push({text: this.text, done: false});
this.text = '';
}
}

四、删除按钮功能

methods: {
del: function(item) {
this.list.splice(this.list.indexOf(item), 1);
}
}

五、已完成按钮功能

js 新增:

methods: {
finish: function(item) {
item.done = true;
},
unfinish: function(item) {
item.done = false;
}
}

html 新增:

<span v-bind:class="{isdone: item.done}">{{ item.text }}</span>

css 新增:

.isdone { text-decoration: line-through; }

截图:

六、增加待完成、已完成条数,最终完善

js 新增:

computed: {
todoNum: function() {
return this.list.filter(function(item) {
return !item.done;
}).length;
},
finishNum: function() {
return this.list.filter(function(item) {
return item.done;
}).length;
},
}

html 代码:

<div id="app" v-cloak>
<h3>vue分享 todolist</h3>
<input type="text" placeholder="待办事项" v-model="text">
<button type="button" v-on:click="add">增加</button> <ul v-if="list.length">
<li v-for="item in list">
<span v-bind:class="{isdone: item.done}">{{ item.text }}</span>
<button type="button" v-on:click="unfinish(item)" v-if="item.done">未完成</button>
<button type="button" v-on:click="finish(item)" v-else>已完成</button>
<button type="button" v-on:click="del(item)">删除</button>
</li>
</ul>
<p v-else>
空空如也
</p> <p>待办 {{ todoNum }} 条,已完成 {{ finishNum }} 条。</p>
</div>

演示:

实战源码

https://gitlab.com/imzhi/vue-share-todolist

vue.js 实战 todo list的更多相关文章

  1. vue.js实战——购物车练习(包含全选功能)

    vue.js实战第5章 54页的练习1 直接放代码好了,全选的部分搞了好久,代码好像有点啰嗦,好在实现功能了(*^▽^*) HTML: <!DOCTYPE html> <html l ...

  2. 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能

    大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...

  3. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...

  4. vue.js实战(文摘)

    ---------------第1篇 基础篇 第1章 初始vue.js 第2章 数据绑定和第一个vue应用 第3章 计算属性 第4章 v-bind及class与style绑定 第5章 内置命令 第6章 ...

  5. Vue.js 实战教程(附demo)

    在实战之前,你需要对vuejs的基础语法有一定的了解,可以通过以下几个途径进行学习: vue.js官方文档:https://cn.vuejs.org/v2/guide/index.html vue.j ...

  6. Vue.js 实战总结

    最近在某个项目中用到了Vue.js,从上手做开发到项目发布,一步步踩了不少坑.本文试图总结过去一个多月使用Vue.js中的一些经验,也算是一点心得体会吧,拿出来与大家分享,欢迎多多交流. Vue.js ...

  7. vue.js实战——props单向数据流

    Vue2.x通过props传递数据是单向的了,也就是父组件数据变化时会传递给子组件,但是反过来不行. 业务中会经常遇到两种需要改变prop的情况, 一种是父组件传递初始值进来,子组件将它作为初始值保存 ...

  8. vue.js实战——升级版购物车

    HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. vue.js实战——$event

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 模板汇总——LCT

    link-cut tree #define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] ; struct Node{ int rev, rt; ], ...

  2. CodeForces 416 B Appleman and Tree DP

    Appleman and Tree 题解: 定义dp[u][1] 为以u的子树范围内,u这个点已经和某个黑点相连的方案数. dp[u][0] 为在u的子树范围内, u这个点还未和某个黑点相连的方案数. ...

  3. 性能测试:通过设置注册表提高 P2P/IIS 并发数

    写在前面 在执行性能测试(如用 JMeter 直接压接口)的时候,有的时候并发数上不去.本机大面积出现 TCP 状态为 TIME_WAIT,除了放开 TCP 端口数和调整默认 TCP 释放时间外,另外 ...

  4. JS-特效 ~ 03. 楼层跳跃、事件对象event的获取与使用、event的主要内容、screenX、pageX、clientX的区别、放大镜、模拟滚动条

    楼层跳跃 100%子盒子会继承父盒子的宽高.父盒子继承body宽高.Body继承html的宽高. 盒子属性:auto:适应盒子自身的宽度或者高度.(对自己负责) 盒子属性:100%:适应盒子父盒子的宽 ...

  5. Spring的事件监听机制

    最近公司在重构广告系统,其中核心的打包功能由广告系统调用,即对apk打包的调用和打包完成之后的回调,需要提供相应的接口给广告系统.因此,为了将apk打包的核心流程和对接广告系统的业务解耦,利用了spr ...

  6. 【Offer】[56-2] 【数组中唯一只出现一次的数字】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 在一个数组中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字 [牛客网刷题地址]无 思路分析 如果一个数字出现 ...

  7. 【Offer】[13] 【机器人的运动范围】

    题目描述 思路分析 Java代码 代码链接 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和 ...

  8. redis持久化的两种方式RDB和AOF

    原文链接:http://www.cnblogs.com/tdws/p/5754706.html Redis的持久化过程中并不需要我们开发人员过多的参与,我们要做的是什么呢?除了深入了解RDB和AOF的 ...

  9. Spring Boot跨域解决方案

    一.什么是跨域 为保证浏览器的安全,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,这称之为同源策略,如果一个请求地址里的协议.域名.端口号都相同,就属于同源.依据浏览器同源策略,非同源脚 ...

  10. 行数据库VS列数据库

    一.介绍 目前大数据存储有两种方案可供选择:行存储和列存储.业界对两种存储方案有很多争持,集中焦点是:谁能够更有效地处理海量数据,且兼顾安全.可靠.完整性.从目前发展情况看,关系数据库已经不适应这种巨 ...