watch
屬性的使用考慮一個問題:想要實現 名
和 姓
兩個文本框的內容改變,則全名的文本框中的值也跟着改變;(用之前的知識如何實現???)html
data
中屬性的改變:<div id="app"> <input type="text" v-model="firstName"> + <input type="text" v-model="lastName"> = <span>{{fullName}}</span> </div> <script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { firstName: 'jack', lastName: 'chen', fullName: 'jack - chen' }, methods: {}, watch: { 'firstName': function (newVal, oldVal) { // 第一個參數是新數據,第二個參數是舊數據 this.fullName = newVal + ' - ' + this.lastName; }, 'lastName': function (newVal, oldVal) { this.fullName = this.firstName + ' - ' + newVal; } } }); </script>
<div id="app"> <router-link to="/login">登陸</router-link> <router-link to="/register">註冊</router-link> <router-view></router-view> </div> <script> var login = Vue.extend({ template: '<h1>登陸組件</h1>' }); var register = Vue.extend({ template: '<h1>註冊組件</h1>' }); var router = new VueRouter({ routes: [ { path: "/login", component: login }, { path: "/register", component: register } ] }); // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: {}, router: router, watch: { '$route': function (newVal, oldVal) { if (newVal.path === '/login') { console.log('這是登陸組件'); } } } }); </script>
computed
計算屬性的使用getter
的計算屬性:<div id="app"> <input type="text" v-model="firstName"> + <input type="text" v-model="lastName"> = <span>{{fullName}}</span> </div> <script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { firstName: 'jack', lastName: 'chen' }, methods: {}, computed: { // 計算屬性; 特色:當計算屬性中因此來的任何一個 data 屬性改變以後,都會從新觸發 本計算屬性 的從新計算,從而更新 fullName 的值 fullName() { return this.firstName + ' - ' + this.lastName; } } }); </script>
getter
和setter
的計算屬性:<div id="app"> <input type="text" v-model="firstName"> <input type="text" v-model="lastName"> <!-- 點擊按鈕從新爲 計算屬性 fullName 賦值 --> <input type="button" value="修改fullName" @click="changeName"> <span>{{fullName}}</span> </div> <script> // 建立 Vue 實例,獲得 ViewModel var vm = new Vue({ el: '#app', data: { firstName: 'jack', lastName: 'chen' }, methods: { changeName() { this.fullName = 'TOM - chen2'; } }, computed: { fullName: { get: function () { return this.firstName + ' - ' + this.lastName; }, set: function (newVal) { var parts = newVal.split(' - '); this.firstName = parts[0]; this.lastName = parts[1]; } } } }); </script>
watch
、computed
和methods
之間的對比computed
屬性的結果會被緩存,除非依賴的響應式屬性變化纔會從新計算。主要看成屬性來使用;methods
方法表示一個具體的操做,主要書寫業務邏輯;watch
一個對象,鍵是須要觀察的表達式,值是對應回調函數。主要用來監聽某些特定數據的變化,從而進行某些具體的業務邏輯操做;能夠看做是computed
和methods
的結合體;nrm
的安裝使用做用:提供了一些最經常使用的NPM包鏡像地址,可以讓咱們快速的切換安裝包時候的服務器地址;
什麼是鏡像:原來包剛一開始是隻存在於國外的NPM服務器,可是因爲網絡緣由,常常訪問不到,這時候,咱們能夠在國內,建立一個和官網徹底同樣的NPM服務器,只不過,數據都是從人家那裏拿過來的,除此以外,使用方式徹底同樣;前端
npm i nrm -g
全局安裝nrm
包;nrm ls
查看當前全部可用的鏡像源地址以及當前所使用的鏡像源地址;nrm use npm
或nrm use taobao
切換不一樣的鏡像源地址;webpack 是前端的一個項目構建工具,它是基於 Node.js 開發出來的一個前端工具;vue
npm i webpack -g
全局安裝webpack,這樣就能在全局使用webpack的命令npm i webpack --save-dev
安裝到項目依賴中npm init
初始化項目,使用npm管理項目中的依賴包cnpm i jquery --save
安裝jquery類庫main.js
並書寫各行變色的代碼邏輯:// 導入jquery類庫 import $ from 'jquery' // 設置偶數行背景色,索引從0開始,0是偶數 $('#list li:even').css('backgroundColor','lightblue'); // 設置奇數行背景色 $('#list li:odd').css('backgroundColor','pink');
main.js
會報錯,由於瀏覽器不認識import
這種高級的JS語法,須要使用webpack進行處理,webpack默認會把這種高級的語法轉換爲低級的瀏覽器能識別的語法;webpack 入口文件路徑 輸出文件路徑
對main.js
進行處理:webpack src/js/main.js dist/bundle.js
webpack.config.js
webpack.config.js
中配置這兩個路徑:// 導入處理路徑的模塊 var path = require('path'); // 導出一個配置對象,未來webpack在啓動的時候,會默認來查找webpack.config.js,並讀取這個文件中導出的配置對象,來進行打包處理 module.exports = { entry: path.resolve(__dirname, 'src/js/main.js'), // 項目入口文件 output: { // 配置輸出選項 path: path.resolve(__dirname, 'dist'), // 配置輸出的路徑 filename: 'bundle.js' // 配置輸出的文件名 } }
webpack-dev-server
來實現代碼實時打包編譯,當修改代碼以後,會自動進行打包構建。cnpm i webpack-dev-server --save-dev
安裝到開發依賴webpack-dev-server
來進行打包,發現報錯,此時須要藉助於package.json
文件中的指令,來進行運行webpack-dev-server
命令,在scripts
節點下新增"dev": "webpack-dev-server"
指令,發現能夠進行實時打包,可是dist目錄下並無生成bundle.js
文件,這是由於webpack-dev-server
將打包好的文件放在了內存中bundle.js
放在內存中的好處是:因爲須要實時打包編譯,因此放在內存中速度會很是快http://localhost:8080/
網站,發現是一個文件夾的面板,須要點擊到src目錄下,才能打開咱們的index首頁,此時引用不到bundle.js文件,須要修改index.html中script的src屬性爲:<script src="../bundle.js"></script>
http://localhost:8080/
的時候直接訪問到index首頁,可使用--contentBase src
指令來修改dev指令,指定啓動的根目錄:"dev": "webpack-dev-server --contentBase src"
同時修改index頁面中script的src屬性爲<script src="bundle.js"></script>
node
html-webpack-plugin
插件配置啓動頁面因爲使用--contentBase
指令的過程比較繁瑣,須要指定啓動的目錄,同時還須要修改index.html中script標籤的src屬性,因此推薦你們使用html-webpack-plugin
插件配置啓動頁面.jquery
cnpm i html-webpack-plugin --save-dev
安裝到開發依賴webpack.config.js
配置文件以下:// 導入處理路徑的模塊 var path = require('path'); // 導入自動生成HTMl文件的插件 var htmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: path.resolve(__dirname, 'src/js/main.js'), // 項目入口文件 output: { // 配置輸出選項 path: path.resolve(__dirname, 'dist'), // 配置輸出的路徑 filename: 'bundle.js' // 配置輸出的文件名 }, plugins:[ // 添加plugins節點配置插件 new htmlWebpackPlugin({ template:path.resolve(__dirname, 'src/index.html'),//模板路徑 filename:'index.html'//自動生成的HTML文件的名稱 }) ] }
package.json
中script
節點中的dev指令以下:"dev": "webpack-dev-server"
html-webpack-plugin
插件會自動把bundle.js注入到index.html頁面中!注意:熱更新在JS中表現的不明顯,能夠從一下子要講到的CSS身上進行介紹說明!webpack
package.json
的script節點以下,其中--open
表示自動打開瀏覽器,--port 4321
表示打開的端口號爲4321,--hot
表示啓用瀏覽器熱更新:"dev": "webpack-dev-server --hot --port 4321 --open"
webpack.config.js
文件,新增devServer
節點以下:devServer:{ hot:true, open:true, port:4321 }
webpack
模塊:var webpack = require('webpack');
plugins
節點下新增:new webpack.HotModuleReplacementPlugin()
cnpm i style-loader css-loader --save-dev
webpack.config.js
這個配置文件:module: { // 用來配置第三方loader模塊的 rules: [ // 文件的匹配規則 { test: /\.css$/, use: ['style-loader', 'css-loader'] }//處理css文件的規則 ] }
use
表示使用哪些模塊來處理test
所匹配到的文件;use
中相關loader模塊的調用順序是從後向前調用的;cnpm i less-loader less -D
webpack.config.js
這個配置文件:{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
cnpm i sass-loader node-sass --save-dev
webpack.config.js
中添加處理sass文件的loader模塊:{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
cnpm i url-loader file-loader --save-dev
webpack.config.js
中添加處理url路徑的loader模塊:{ test: /\.(png|jpg|gif)$/, use: 'url-loader' }
limit
指定進行base64編碼的圖片大小;只有小於指定字節(byte)的圖片纔會進行base64編碼:{ test: /\.(png|jpg|gif)$/, use: 'url-loader?limit=43960' },
cnpm i babel-core babel-loader babel-plugin-transform-runtime --save-dev
安裝babel的相關loader包cnpm i babel-preset-es2015 babel-preset-stage-0 --save-dev
安裝babel轉換的語法webpack.config.js
中添加相關loader模塊,其中須要注意的是,必定要把node_modules
文件夾添加到排除項:{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
.babelrc
文件,並修改這個配置文件以下:{ "presets":["es2015", "stage-0"], "plugins":["transform-runtime"] }
babel-preset-es2015
能夠更新爲babel-preset-env
,它包含了全部的ES相關的語法;babel-preset-env:你須要的惟一Babel插件
Runtime transform 運行時編譯es6git