VUE2.0學習css
核心庫
只關注視圖層,可是vue並不僅關注視圖,和angular同樣也有指令,過濾器這些東西# 全局安裝 vue-cli $ npm install --global vue-cli # 建立一個基於 webpack 模板的新項目 $ vue init webpack my-project # 安裝依賴,走你 $ cd my-project $ npm install $ npm run dev
npm install vue-loader -save-dev
{ test: /\.js$/, // 用正則來匹配文件路徑,這段意思是匹配 js 或者 jsx loader: 'babel'// 加載模塊 "babel" 是 "babel-loader" 的縮寫 }, { test: /\.vue$/, loader: 'vue' }
vue: { loaders: { js: 'babel' } }
{ "presets": ["es2015","stage-0","stage-1","stage-2","stage-3"] // "plugins": ["transform-runtime"] }
resolve: { extensions: ['', '.js', '.json', '.scss', '.vue'] }
npm install vue -save
npm install vue-template-compiler -save
import Vue from 'vue' import AppContainer from '../containers/AppContainer' const app = new Vue({ render: h => h(AppContainer), }).$mount('#app') // new Vue({ // el:'#app', // render: h => h(App) // })
<template> <div> {{msg}} </div> </template> <style> body{ background-color:#ff0000; } </style> <script> export default{ data(){ return{ msg:'hello vue' } } } </script>
實例.動態屬性名
實例.$實例屬性名
獲取this.a
去獲取動態屬性this.$data
去獲取實例屬性var data = {a: 1} const app = new Vue({ // 和數據相關的都掛載到data上 data: data, // 和方法相關的都掛載到methods上 methods: { // this和$的使用 func1: function () { console.log(this.a); console.log(this.$data.a); }, changeData:function () { this.a=2 } } }) // 先監聽再改變 app.$watch('a', function (newVal, oldVal) { console.log(newVal) console.log(oldVal) }) // 值改變以後會自動執行監聽方法 // data的值是能夠直接改變的,和react的setState方法不同,由於vue裏面用了ES6的set和get方法,能夠起到自動監聽的做用 app.a=3 // 動態屬性和實例屬性 // console.log(app) // console.log(app.a) // console.log(app.$data.a)
// 錯誤的寫法 <div id="{{id}}"></div> // 正確的寫法 <div v-bind:id="id"></div>
{{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <div v-bind:id="'list-' + id"></div>
{{ message | capitalize }} {{ message | filterA | filterB }} new Vue({ // ... filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } })
<a v-on:click="doSomething">
<form v-on:submit.prevent="onSubmit"></form>
<!-- 完整語法 --> <a v-bind:href="url"></a> <!-- 縮寫 --> <a :href="url"></a>
<!-- 完整語法 --> <a v-on:click="doSomething"></a> <!-- 縮寫 --> <a @click="doSomething"></a>
計算屬性 vs methodshtml
<template> <div> <p>Original message: "{{ message }}{{name}}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> <p>Computed reversed message: "{{ reverseMessage() }}"</p> </div> </template> <style> body{ background-color:#ff0000; } </style> <script> export default{ data(){ return{ message: 'Hello', name:'a' } }, mounted(){ this.name="b" }, computed: { reversedMessage: function () { console.log('計算屬性被調用了') return this.message.split('').reverse().join('') } }, methods: { reverseMessage: function () { console.log('方法被執行了') return this.message.split('').reverse().join('') } } } </script>
計算屬性 vs watchvue
<!--頁面--> <div id="demo">{{ fullName }}</div>
//watch寫法 var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar', fullName: 'Foo Bar' }, watch: { firstName: function (val) { this.fullName = val + ' ' + this.lastName }, lastName: function (val) { this.fullName = this.firstName + ' ' + val } } }) //計算屬性的寫法 //本質是你要獲取全名 var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar' }, computed: { fullName: function () { return this.firstName + ' ' + this.lastName } } })
計算setterreact
// 接上面的代碼段 computed: { fullName: { // getter get: function () { return this.firstName + ' ' + this.lastName }, // setter set: function (newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } } }
<template>
標籤包裹,v-if做用在template標籤上<template>
語法<my-components is="todo-item" v-for="(item, index) in todos" v-bind:title="item" v-on:remove="item.splice(index, 1)" > </my-components>
// <li v-for="n in evenNumbers">{{ n }}</li> data: { numbers: [ 1, 2, 3, 4, 5 ] }, computed: { evenNumbers: function () { return this.numbers.filter(function (number) { return number % 2 === 0 }) } }
<button v-on:click="warn('Form cannot be submitted yet.', $event)">Submit</button>
methods: { warn: function (message, event) { // 如今咱們能夠訪問原生事件對象 if (event) event.preventDefault() alert(message) } }
<!-- 阻止單擊事件冒泡 --> <a v-on:click.stop="doThis"></a> <!-- 提交事件再也不重載頁面 --> <form v-on:submit.prevent="onSubmit"></form> <!-- 修飾符能夠串聯 --> <a v-on:click.stop.prevent="doThat"></a> <!-- 只有修飾符 --> <form v-on:submit.prevent></form> <!-- 添加事件偵聽器時使用時間捕獲模式 --> <div v-on:click.capture="doThis">...</div> <!-- 只當事件在該元素自己(而不是子元素)觸發時觸發回調 --> <div v-on:click.self="doThat">...</div> <!-- the click event will be triggered at most once --> <a v-on:click.once="doThis"></a>
<!-- 只有在 keyCode 是 13 時調用 vm.submit() --> <input v-on:keyup.13="submit"> <!-- 同上 --> <input v-on:keyup.enter="submit"> <!-- 縮寫語法 --> <input @keyup.enter="submit"> <!--所有的按鍵別名:--> enter tab delete (捕獲 「刪除」 和 「退格」 鍵) esc space up down left right ctrl alt shift meta
// 可使用 v-on:keyup.f1 Vue.config.keyCodes.f1 = 112
<textarea></textarea>
並不會生效,應用v-model來代替<input type="radio" v-model="pick" v-bind:value="a">
<!-- 在 "change" 而不是 "input" 事件中更新 --> <input v-model.lazy="msg" >
Vue.component('shiguoqing', { template: '<div>石國慶</div>' }) const app = new Vue({ el:'#example' })
<template> <div> 姓名:石國慶,年齡:{{age}},性別:{{genderSex}} </div> </template> <style scope> div{ background-color:orange; } </style> <script> export default{ data(){ return{ } }, props:['age','genderSex'] } </script>
<template> <div> <shi-guoqing></shi-guoqing> {{msg}} </div> </template> <style> body{ background-color:#ff0000; } </style> <script> import Shiguoqing from '../components/Shiguoqing.vue' export default{ data(){ return{ msg:'hello vue' } }, components:{ 'shi-guoqing':Shiguoqing } } </script>
當你在一些特殊標籤如table,ul,ol,select中使用自定義組件的時候會有一些限制webpack
<table> <my-row>...</my-row> </table>
<table> <tr is="my-row"></tr> </table>
應當注意,若是您使用來自如下來源之一的字符串模板,這些限制將不適用:git
<script type="text/x-template">
☆在自定義組件中data屬性必須是函數形式☆github
<!-- 傳遞實際的數字 --> <comp v-bind:some-prop="1"></comp>
☆注意在JavaScript中對象和數組是引用類型,指向同一個內存空間,若是prop是一個對象或數組,在子組件內部改變它會影響父組件的狀態。web
咱們在傳遞屬性的時候能夠作屬性校驗vue-router
Vue.component('currency-input', { template: '\ <span>\ $\ <input\ ref="input"\ v-bind:value="value"\ v-on:input="updateValue($event.target.value)"\ >\ </span>\ ', props: ['value'], methods: { // 不是直接更新值,而是使用此方法來對輸入值進行格式化和位數限制 updateValue: function (value) { var formattedValue = value // 刪除兩側的空格符 .trim() // 保留 2 小數位 .slice(0, value.indexOf('.') + 3) // 若是值不統一,手動覆蓋以保持一致 if (formattedValue !== value) { this.$refs.input.value = formattedValue } // 經過 input 事件發出數值 this.$emit('input', Number(formattedValue)) } } })
// 在根組件中註冊bus屬性 const app = new Vue({ data:{ bus:new Vue() }, render: h => h(AppContainer), }).$mount('#app')
// 在子組件中使用 this.$root.bus.$emit('eventName',2323)
做用域插槽是一種特殊類型的插槽,用做使用一個(可以傳遞數據到)可重用模板替換已渲染元素。vuex
組件的遞歸調用
<unique-name-of-my-component name="unique-name-of-my-component"></unique-name-of-my-component>
組件的循環引用
一、本博客中的文章摘自網上的衆多博客,僅做爲本身知識的補充和整理,並分享給其餘須要的coder,不會用於商用。
二、由於不少博客的地址看完沒有及時作保存,因此不少不會在這裏標明出處,很是感謝各位大牛的分享,也但願你們理解。