在使用 vue 的时候, 推荐安装 Vue Devtools
- https://github.com/vuejs/vue-devtools#vue-devtools
- Browser devtools extension for debugging Vue.JS applications.
直接引入 < script>, 开发版本包含完整的警告和调试模式, 生产版本删除了警告, 33.30KB min+gzip
CDN 使用
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
生产环境
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
使用原生 ES Modules
- <script type="module">
- import Vue from 'https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.esm.browser.js'
- </script>
- https://cdn.jsdelivr.net/npm/vue/
image.PNG
获取 Vue
- https://unpkg.com/vue@2.6.10/dist/vue.js
- https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js
发布的站点中使用生产环境版本
vue.JS 换成 vue.min.JS
- NPM
- # 最新稳定版
- $ NPM install vue
CLI 工具
开发版本:
- Git clone https://github.com/vuejs/vue.git node_modules/vue
- cd node_modules/vue
- NPM install
- NPM run build
- # 最新稳定版本
- $ bower install vue
- Vue
一套用于构建用户界面的渐进式框架
自底向上逐层应用
核心库只关注视图层
- <!-- 开发环境版本, 包含了有帮助的命令行警告 -->
- <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">
- </script>
- <!-- 生产环境版本, 优化了尺寸和速度 -->
- <script src="https://cdn.jsdelivr.net/npm/vue">
- </script>
vue-cli 安装
渲染
- <div id="app">
- {{ message }}
- </div>
- var App = new Vue({
- el: '#app',
- data: {
- message: 'Hello Vue!'
- }
- })
绑定元素特性
- <div id="app-2">
- <span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
- </span>
- </div>
- var app2 = new Vue({
- el: '#app-2',
- data: {
- message: '页面加载于' + new Date().toLocaleString()
- }
- })
指令
条件与循环
- <div id="app-3">
- <p v-if="seen"> 现在你看到我了 </p>
- </div>
- var app3 = new Vue({
- el: '#app-3',
- data: {
- seen: true
- }
- })
- <div id="app-4">
- <ol>
- <li v-for="todo in todos">
- {{ todo.text }}
- </li>
- </ol>
- </div>
- var app4 = new Vue({
- el: '#app-4',
- data: {
- todos: [
- { text: '学习 JavaScript' },
- { text: '学习 Vue' },
- { text: '整个牛项目' }
- ]
- }
- })
- app4.todos.push({ text: '新项目' })
v-on 指令添加一个事件监听器
- <div id="app-5">
- <p>{{ message }}</p>
- <button v-on:click="reverseMessage"> 反转消息 </button>
- </div>
- var app5 = new Vue({
- el: '#app-5',
- data: {
- message: 'Hello Vue.js!'
- },
- methods: {
- reverseMessage: function () {
- this.message = this.message.split('').reverse().join('')
- }
- }
- })
v-model 指令
实现表单输入和应用状态之间的双向绑定
- <div id="app-6">
- <p>{{ message }}</p>
- <input v-model="message">
- </div>
- var app6 = new Vue({
- el: '#app-6',
- data: {
- message: 'Hello Vue!'
- }
- })
组件化应用构建
一个组件树:
Component Tree
Vue 中注册组件很简单:
- // 定义名为 todo-item 的新组件
- Vue.component('todo-item', {
- template: '<li > 这是个待办项 </li>'
- })
- <ol>
- <!-- 创建一个 todo-item 组件的实例 -->
- <todo-item></todo-item>
- </ol>
从父作用域将数据传到子组件
- Vue.component('todo-item', {
- // todo-item 组件现在接受一个
- // "prop", 类似于一个自定义特性.
- // 这个 prop 名为 todo.
- props: ['todo'],
- template: '<li>{{ todo.text }}</li>'
- })
- <div id="app-7">
- <ol>
- <!--
- 现在我们为每个 todo-item 提供 todo 对象
- todo 对象是变量, 即其内容可以是动态的.
- 我们也需要为每个组件提供一个 "key", 稍后再
- 作详细解释.
- -->
- <todo-item
- v-for="item in groceryList"
- v-bind:todo="item"
- v-bind:key="item.id"
- ></todo-item>
- </ol>
- </div>
- Vue.component('todo-item', {
- props: ['todo'],
- template: '<li>{{ todo.text }}</li>'
- })
- var app7 = new Vue({
- el: '#app-7',
- data: {
- groceryList: [
- { id: 0, text: '蔬菜' },
- { id: 1, text: '奶酪' },
- { id: 2, text: '随便其它什么人吃的东西' }
- ]
- }
- })
子单元通过 prop 接口与父单元进行了良好的解耦
创建实例
- var vm = new Vue({
- // 选项
- })
- vm (ViewModel 的缩写)
表示 Vue 实例
- // 我们的数据对象
- var data = { a: 1 }
- // 该对象被加入到一个 Vue 实例中
- var vm = new Vue({
- data: data
- })
- // 获得这个实例上的属性
- // 返回源数据中对应的字段
- vm.a == data.a // => true
- // 设置属性也会影响到原始数据
- vm.a = 2
- data.a // => 2
- // ...... 反之亦然
- data.a = 3
- vm.a // => 3
- Object.freeze()
响应系统无法再追踪变化
- var obj = {
- foo: 'bar'
- }
- Object.freeze(obj)
- new Vue({
- el: '#app',
- data: obj
- })
- <div id="app">
- <p>{{ foo }}</p>
- <!-- 这里的 `foo` 不会更新! -->
- <button v-on:click="foo ='baz'">Change it</button>
- </div>
- var data = { a: 1 }
- var vm = new Vue({
- el: '#example',
- data: data
- })
- vm.$data === data // => true
- vm.$el === document.getElementById('example') // => true
- // $watch 是一个实例方法
- vm.$watch('a', function (newValue, oldValue) {
- // 这个回调将在 `vm.a` 改变后调用
- })
生命周期
数据监听, 编译模板, 将实例挂载到 DOM 并在数据变化时更新 DOM
- new Vue({
- data: {
- a: 1
- },
- created: function () {
- // `this` 指向 vm 实例
- console.log('a is:' + this.a)
- }
- })
- // => "a is: 1"
实例的生命周期
Vue 实例生命周期
image.PNG
image.PNG
image.PNG
清除浮动
添加空 div, 使用 clear: both
父元素使用 overflow: hidden
父元素使用 overflow: auto
父级定义高度
父级 div 定义伪类: after 和 zoom
image.PNG
- #test {
- position: absolute;
- width: 100px;
- height: 100px;
- background-color: green;
- <!-- 三行代码缺一不可 -->
- margin: 0 auto;
- left: 0;
- right: 0;
- }
- <div id="test"></div>
利用 CSS 画三角形
- #triangle {
- width: 0;
- height: 0;
- border-top: 40px solid transparent;
- border-left: 40px solid transparent;
- border-right: 40px solid transparent;
- border-bottom: 40px solid greenyellow;
- }
- <div id="triangle"><div>
display:none; 不显示对应的元素
visibility:hidden; 隐藏对应元素
position:absolute/fixed; 优先级最高, 有他们在时, float 不起作用
清除浮动的方式:
父级 div 定义 height
最后一个浮动元素后加空 div 标签 并添加样式 clear:both
父级 div 定义 zoom
包含浮动元素的父标签添加样式 overflow 为 hidden 或 auto
: 表示伪类,:: 表示伪元素
this 是在执行上下文创建时确定的一个在执行过程中不可更改的变量
image.PNG
MVVM 分为 Model,View,ViewModel 三者
Model 代表数据模型
View 代表 UI 视图
ViewModel 负责监听 Model 中数据的改变并且控制视图的更新
父子组件通讯: 父 -> 子: 使用 props, 子 -> 父:$emit 方法传递参数
.prevent: 提交事件不再重载页面;
.stop: 阻止单击事件冒泡;
.self: 当事件发生在该元素本身而不是子元素的时候会触发;
.capture: 事件侦听, 事件发生的时候会调用;
$route 是 "路由信息对象"
$router 是 "路由实例" 对象包括了路由的跳转方法, 钩子函数等
image.PNG
image.PNG
Promise 的特点
状态一旦改变就再也不会发生改变了
如何创建 Promise 实例?
- const promise = new Promise(function(resolve, reject) {
- if (/* 异步操作成功 */){
- resolve(value);
- } else {
- reject(error);
- }
- });
- let promise = Promise.resolve($.Ajax('/test/test.json'));// => promise 对象
- promise.then(function(value){
- console.log(value);
- });
小程序本质就是一个单页应用
功能可分为渲染层 webview 和逻辑层 appService 两个部分
image.PNG
image.PNG
image.PNG
image.PNG
image.PNG
image.PNG
image.PNG
image.PNG
深拷贝和浅拷贝是针对复杂数据类型来说的, 浅拷贝只拷贝一层, 而深拷贝是层层拷贝.
请点赞! 因为你的鼓励是我写作的最大动力!
官方微信公众号
吹逼交流群: 711613774
吹逼交流群
来源: http://www.jianshu.com/p/90d8be014c0d