在使用Vue的时候,推荐安装Vue Devtoolsvue
https://github.com/vuejs/vue-devtools#vue-devtoolsnode
Browser devtools extension for debugging Vue.js applications.git
直接引入<script>
,开发版本包含完整的警告和调试模式,生产版本删除了警告,33.30KB min+gzipgithub
CDN使用web
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
生产环境ajax
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
使用原生 ES Modulesvue-cli
<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/npm
获取Vuejson
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
开发版本:
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('') } } })
实现表单输入和应用状态之间的双向绑定
<div id="app-6"> <p>{{ message }}</p> <input v-model="message"> </div> var app6 = new Vue({ el: '#app-6', data: { message: 'Hello Vue!' } })
一个组件树:
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"
实例的生命周期
添加空div,使用clear: both
父元素使用overflow: hidden
父元素使用overflow: auto
父级定义高度
父级div定义伪类:after和zoom
#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是在执行上下文建立时肯定的一个在执行过程当中不可更改的变量
MVVM分为Model、View、ViewModel三者
Model 表明数据模型
View 表明UI视图
ViewModel 负责监听 Model 中数据的改变而且控制视图的更新
父子组件通信:父->子:使用props,子->父:$emit方法传递参数
.prevent: 提交事件再也不重载页面; .stop: 阻止单击事件冒泡; .self: 当事件发生在该元素自己而不是子元素的时候会触发; .capture: 事件侦听,事件发生的时候会调用;
$route 是“路由信息对象” $router 是“路由实例”对象包括了路由的跳转方法,钩子函数等
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两个部分
深拷贝和浅拷贝是针对复杂数据类型来讲的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。
吹逼交流群:711613774