<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                這個章節通過實例,基本完整的描述了vue.js的核心技術。是一個快速入門的教程; ## 一、申明式渲染 Vue.js 的核心是一個允許采用簡潔的模板語法來聲明式地將數據渲染進 DOM 的系統: 1、普通文本插值及指令綁定渲染 ``` <div id="app"> {{ message }} <span v-bind:title="titleMsg"> 鼠標懸停幾秒鐘查看此處動態綁定的提示信息! </span> </div> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!', titleMsg:'頁面加載于 ' + new Date().toLocaleString() } }) ``` ![](https://img.kancloud.cn/0f/f4/0ff43d5eda5b8799b91e52919ff9b48f_699x73.png) 2、條件 ``` <div id="app"> <p v-if="seen">現在你看到我了</p> </div> var app = new Vue({ el: '#app', data: { seen: true } }) ``` ![](https://img.kancloud.cn/51/4f/514f52acbc6533960dbda57da39493a4_701x69.png) 3、循環 ``` <div id="app"> <ol> <li v-for="todo in todos"> {{ todo.text }} </li> </ol> </div> var app = new Vue({ el: '#app', data: { todos: [ { text: '學習 JavaScript' }, { text: '學習 Vue' }, { text: '整個牛項目' } ] } }) ``` ![](https://img.kancloud.cn/41/2b/412b74afb957d958893c112bcc7fed81_696x123.png) ## 二、用戶輸入 為了讓用戶和你的應用進行交互。 1、我們可以用 v-on 指令添加一個事件監聽器,通過它調用在 Vue 實例中定義的方法: ``` <div id="app"> <p>{{ message }}</p> <button v-on:click="reverseMessage">反轉消息</button> </div> var app = new Vue({ el: '#app', data: { message: 'Hello Vue.js!' }, methods: { reverseMessage: function () { this.message = this.message.split('').reverse().join('') } } }) ``` ![](https://img.kancloud.cn/a6/12/a6128fbf4ce4943d9709967ce48fb394_699x99.png) ![](https://img.kancloud.cn/f9/ee/f9eea61a08d44cc4a79b9ab7112a4847_700x95.png) 2、Vue 還提供了 v-model 指令,它能輕松實現表單輸入和應用狀態之間的雙向綁定; ``` <div id="app"> <p>{{ message }}</p> <input v-model="message"> </div> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) ``` ![](https://img.kancloud.cn/d8/09/d809ba81968177f96258247d76ca0c3a_699x106.png) ## 三、組件化 幾乎任意類型的應用界面都可以抽象為一個組件樹,組件是可復用的 Vue 實例; ![](https://img.kancloud.cn/59/f9/59f9c7516cbd2ed27137b3341b05c800_1406x544.png) 在 Vue 里,一個組件本質上是一個擁有預定義選項的一個 Vue 實例。 1、注冊一個簡單的組件 // 定義名為 todo-item 的新組件 ``` Vue.component('todo-item', { template: '<li>這是個待辦項</li>' }) var app = new Vue(...) ``` 2、現在你可以用它構建另一個組件模板: ``` <ol> <!-- 創建一個 todo-item 組件的實例 --> <todo-item></todo-item> </ol> ``` 3、這樣會為每個待辦項渲染同樣的文本,我們一般都需要能從父組件將數據傳到子組件才對。修改一下該組件的定義,使之能夠接受一個prop(子單元通過 prop 接口與父單元進行了良好的解耦): ``` Vue.component('todo-item', { // todo-item 組件現在接受一個 // "prop",類似于一個自定義 attribute。 // 這個 prop 名為 todo。 props: ['todo'], template: '<li>{{ todo.text }}</li>' }) ``` 現在,我們可以使用 v-bind 指令將待辦項傳到循環輸出的每個組件中: ``` <div id="app-7"> <ol> <!-- 現在我們為每個 todo-item 提供 todo 對象 todo 對象是變量,即其內容可以是動態的。 基于采用v-for,所以需要為每個組件提供一個“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: '隨便其它什么人吃的東西' } ] } }) ``` ![](https://img.kancloud.cn/c5/30/c5303d159189b124c278603303301326_696x125.png) ## 四、Vue實例 每個 Vue 應用都是通過用`Vue`函數創建一個新的**Vue 實例**開始的,所有的 Vue 組件都是 Vue 實例,并且接受相同的選項對象 (一些根實例特有的選項除外); 1、數據與方法 當一個 Vue 實例被創建時,它將 data 對象中的所有的屬性加入到 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 ``` 當這些數據改變時,視圖會進行重渲染。值得注意的是只有當實例被創建時就已經存在于 data 中的屬性才是響應式的。也就是說如果你添加一個新的屬性,比如: ``` vm.b = 'hi' ``` 那么對`b`的改動將不會觸發任何視圖的更新。因此,如果你知道你會在晚些時候需要一個屬性,但是一開始它為空或不存在,那么你也需要定義它,并設置一些初始值。 2、實例生命周期鉤子 每個 Vue 實例在被創建時都要經過一系列的初始化過程——例如,需要設置數據監聽、編譯模板、將實例掛載到 DOM 并在數據變化時更新 DOM 等。同時在這個過程中也會運行一些叫做生命周期鉤子的函數,這給了用戶在不同階段添加自己的代碼的機會。 比如 created 鉤子可以用來在一個實例被創建之后執行代碼: ``` new Vue({ data: { a: 1 }, created: function () { // `this` 指向 vm 實例 console.log('a is: ' + this.a) } }) // => "a is: 1" ``` 也有一些其它的鉤子,在實例生命周期的不同階段被調用,如 mounted、updated 和 destroyed。 >[danger] > 1、生命周期鉤子的 this 上下文指向調用它的 Vue 實例。 > 2、不要在選項屬性或回調上使用箭頭函數,比如 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())。因為箭頭函數并沒有 this,this 會作為變量一直向上級詞法作用域查找,直至找到為止,經常導致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之類的錯誤。 > 3、生命周期圖示 ![](https://img.kancloud.cn/d0/91/d0917d9b7c801ab541557b4547c95a71_1200x3039.png) ## 五、頁面模板 Vue.js 使用了基于 HTML 的模板語法,允許開發者聲明式地將 DOM 綁定至底層 Vue 實例的數據。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循規范的瀏覽器和 HTML 解析器解析。在底層的實現上,Vue 將模板編譯成虛擬 DOM 渲染函數。結合響應系統,Vue 能夠智能地計算出最少需要重新渲染多少組件,并把 DOM 操作次數減到最少。 1、插值 數據綁定最常見的形式就是使用“Mustache”語法 (雙大括號) 的文本插值: ``` <span>Message: {{ msg }}</span> ``` 2、指令 指令 (Directives) 是帶有 v- 前綴的特殊 attribute。指令 attribute 的值預期是單個 JavaScript 表達式 (v-for 是例外情況)。指令的職責是,當表達式的值改變時,將其產生的連帶影響,響應式地作用于 DOM。 | 元素 | 說明 | 實例| | --- | --- |--- | | 參數 | 一些指令能夠接收一個“參數”,在指令名稱之后以冒號表示。|\<a v-bind:href=url>...\</a>,在這里href是參數,告知v-bind指令將該元素的href的attribute 與表達式url的值綁定 | | 動態參數 |可以用方括號括起來的 JavaScript 表達式作為一個指令的參數| \<a v-bind:[attributeName]="url"> ... \</a>,這里的attributeName會被作為一個 JavaScript 表達式進行動態求值,求得的值將會作為最終的參數來使用 | | 修飾符 | 是以半角句號.指明的特殊后綴,用于指出一個指令應該以特殊方式綁定。 |\<form v-on:submit.prevent="onSubmit">...\</form>| ## 六、計算屬性 模板內的表達式非常便利,但是設計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。例如: ``` <div id="example"> {{ message.split('').reverse().join('') }} </div> ``` 在這個地方,模板不再是簡單的聲明式邏輯。而是針對變量message做了一些算法處理,當你想要在模板中多次引用該字符串時,就比較麻煩。這里,1、vue可以采用計算屬性來解決; ``` <div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> </div> var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // 計算屬性的 getter reversedMessage: function () { // `this` 指向 vm 實例 return this.message.split('').reverse().join('') } } }) //結果 Original message: "Hello" Computed reversed message: "olleH" ``` 2、組件方法實現 你可能已經注意到我們可以通過在表達式中調用方法來達到同樣的效果: ``` <p>Reversed message: "{{ reversedMessage() }}"</p> ``` ``` // 在組件中 methods: { reversedMessage: function () { return this.message.split('').reverse().join('') } } ``` >[danger] 我們可以將同一函數定義為一個方法而不是一個計算屬性。兩種方式的最終結果確實是完全相同的。然而,不同的是**計算屬性是基于它們的響應式依賴進行緩存的**。只在相關響應式依賴發生改變時它們才會重新求值。這就意味著只要`message`還沒有發生改變,多次訪問`reversedMessage`計算屬性會立即返回之前的計算結果,而不必再次執行函數。 計算屬性默認只有 getter ,不過在需要時你也可以提供一個 setter : ``` // ... 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] } } } // ... ``` 現在再運行 vm.fullName = 'John Doe' 時,setter 會被調用,vm.firstName 和 vm.lastName 也會相應地被更新。 ## 七、偵聽器 雖然計算屬性在大多數情況下更合適,但有時也需要一個自定義的偵聽器。Vue 通過 watch 選項提供了一個更通用的方法,來響應數據的變化。當需要在數據變化時執行異步或開銷較大的操作時,這個方式是最有用的。 ``` <div id="watch-example"> <p> Ask a yes/no question: <input v-model="question"> </p> <p>{{ answer }}</p> </div> ``` ``` <!-- 因為 AJAX 庫和通用工具的生態已經相當豐富,Vue 核心代碼沒有重復 --> <!-- 提供這些功能以保持精簡。這也可以讓你自由選擇自己更熟悉的工具。 --> <script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script> <script> var watchExampleVM = new Vue({ el: '#watch-example', data: { question: '', answer: 'I cannot give you an answer until you ask a question!' }, watch: { // 如果 `question` 發生改變,這個函數就會運行 question: function (newQuestion, oldQuestion) { this.answer = 'Waiting for you to stop typing...' this.debouncedGetAnswer() } }, created: function () { // `_.debounce` 是一個通過 Lodash 限制操作頻率的函數。 // 在這個例子中,我們希望限制訪問 yesno.wtf/api 的頻率 // AJAX 請求直到用戶輸入完畢才會發出。想要了解更多關于 // `_.debounce` 函數 (及其近親 `_.throttle`) 的知識, // 請參考:https://lodash.com/docs#debounce this.debouncedGetAnswer = _.debounce(this.getAnswer, 500) }, methods: { getAnswer: function () { if (this.question.indexOf('?') === -1) { this.answer = 'Questions usually contain a question mark. ;-)' return } this.answer = 'Thinking...' var vm = this axios.get('https://yesno.wtf/api') .then(function (response) { vm.answer = _.capitalize(response.data.answer) }) .catch(function (error) { vm.answer = 'Error! Could not reach the API. ' + error }) } } }) </script> ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看