1. 程式人生 > 其它 >Vue全家桶--09 生命週期和 Ajax 服務端通訊

Vue全家桶--09 生命週期和 Ajax 服務端通訊

Vue全家桶--09 生命週期和 Ajax 服務端通訊

9.1 Vue例項生命週期

生命週期鉤子函式

每個 Vue 例項在被建立時都要經過一系列的初始化過程

  生命週期分為三大階段:初始化顯示、更新顯示、銷燬Vue例項

  初始化階段的鉤子函式:

    beforeCreate() 例項建立前:資料和模板均未獲取到

    created() 例項建立後: 最早可訪問到 data 資料,但模板未獲取到

    beforeMount() 資料掛載前:模板已獲取到,但是資料未掛載到模板上。

    mounted() 資料掛載後: 資料已掛載到模板中

  更新階段的鉤子函式:

    beforeUpdate() 模板更新前:data 改變後,更新資料模板前呼叫

    updated() 模板更新後:將 data 渲染到資料模板中

  銷燬階段的鉤子函式:

    beforeDestroy() 例項銷燬前

    destroyed() 例項銷燬後

生命週期圖示

DEMO

<body>
    <div id="app">
        <h1>{{ msg }}</h1>
    </div>
    <script src="./node_modules/vue/dist/vue.js"></script>
    <script>
        var
vm = new Vue({ //el: '#app', data: { msg: 'heloo' }, beforeCreate() { console.log('beforeCreate()', this.$el, this.$data) }, created() { // 已初始化 data 資料,但資料未掛載到模板中 console.log(
'created()', this.$el, this.$data) }, beforeMount() { // 模板已獲取到,但是資料未掛載到模板上 console.log('beforeMount()', this.$el, this.$data) }, mounted() { // 編譯完成 ,資料已掛載到模板中 console.log('mounted()', this.$el, this.$data) }, beforeUpdate() { // 當 data 改變後,去更新模板中的資料前呼叫 // 注意:瀏覽器問題,需使用 this.$el.innerHTML 獲取更新前的 Dom 模板資料 console.log('beforeUpdate()', this.$el.innerHTML, this.$data) }, updated() { // data 被 Vue 渲染之後的 Dom 資料模板 console.log('updated()', this.$el.innerHTML, this.$data) }, beforeDestroy() { console.log('beforeDestroy'); }, destroyed() { console.log('destroyed'); } }).$mount('#app'); // 例項中未使用 el 選項,可使用$mount()手動掛載 Dom // vm.$destroy() 銷燬 Vue 例項 </script> </body>

9.2 liveServer服務端外掛

1. 在 VS Code 中安裝 liveServer 服務端外掛,用於 Ajax 介面呼叫

2. 啟動伺服器:
方式1:任意開啟一個 html 頁面,在最下面可看到 GoLive 點選啟動,預設埠5500
方式2:在 html 頁面單擊右鍵 ,點選如下,訪問頁面
注意:如果之前啟動過伺服器,則使用 方式2 啟動html頁面,不能使用 方式1 會端口占用

3. 更改 liveServer 預設埠號:
按 Ctrl + , 開啟 Settings ,如下操作,開啟 settings.json,
再json檔案中新增 "liveServer.settings.port": 8080,

9.3 Vue中常用的ajax庫

目前 Vue 官方沒有內建任何 ajax 請求方法
1 vue-resource
在 vue1.x 版本中, 被廣泛使用的非官方 Vue 外掛 vue-resource
2 axios
在 vue 2+ 版本中,官方推薦使用非常棒的第三方 ajax 請求庫

使用:結合生命鉤子獲取資料,渲染資料 created()

9.4 vue-resource的使用

參考手冊:https://github.com/pagekit/vue-resource/blob/develop/docs/http.md

npm安裝命令:npm install vue-resource

<body>
    <div id="app">
        <ul>
            <li v-for="(item,index) in msg" :key="index">{{item.name}}</li>
        </ul>
    </div>

    <script src="./node_modules/vue/dist/vue.js"></script>
    <script src="./node_modules/vue-resource/dist/vue-resource.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                msg: []
            },
            created() {
                this.$http.get('http://127.0.0.1:5500/vue-07-lifecycle&ajax/db.json').then((response) => {
                    // 如果要使用Vue例項的this,此處需要使用箭頭函式
                    // success callback
                    console.log(response.data) // 響應資料
                    this.msg = response.data
                }, (response) => {
                    // error callback
                    console.log(response.statusText) //錯誤資訊
                })
            }
        });

    </script>
</body>

9.5 axios的使用

參考手冊:https://github.com/axios/axios/blob/master/README.md

npm安裝命令:npm install axios

<body>
    <div id="app">
        <ul>
            <li v-for="(item,index) in msg" :key="index">{{item.name}},{{item.age}}</li>
        </ul>
    </div>

    <script src="./node_modules/vue/dist/vue.js"></script>
    <script src="./node_modules/axios/dist/axios.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                msg: []
            },
            created() {
                axios.get('http://127.0.0.1:5500/vue-07-lifecycle&ajax/db.json').then(response => {
                    console.log(response.data) // 得到返回結果資料
                    this.msg = response.data
                }).catch(error => {
                    console.log(error.message)
                })
            }
        });
    </script>
</body>

9.6 元件化axios通訊

將上一章的Bootstrap案例,新增axios非同步訪問

安裝npm :npm install axios

引入axios.js

<script src="../node_modules/axios/dist/axios.js"></script>

emp.json

[
{"id": 1, "name": "張三1", "salary": 9899},
{"id": 2, "name": "張三2", "salary": 9999},
{"id": 3, "name": "張三3", "salary": 9099},
{"id": 4, "name": "張三4", "salary": 9199}
]

重構 AppHome.js

; (function () {

    const template = ` <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">

    <!--右邊上半區域-->
    <!--<h1 class="page-header">Dashboard</h1>-->
    <!--定義插槽-->
    <slot name="dashboard"></slot>
    <dash-board :hobbies='hobbies' @del-Hobby="deleteHobby"></dash-board>

    <!--右邊下半區域-->
    <h2 class="sub-header">Section title</h2>
    <home-list :empList='empList' :delItem="delItem"></home-list>
  </div>`;

    window.AppHome = {
        template,
        components: {
            DashBoard,
            HomeList
        },
        data() {
            return {
                hobbies: ['看書', '檯球', '睡覺', '擼程式碼'],//dashboard顯示資料
                empList: []
            };
        },
        created() {
            axios.get('http://127.0.0.1:5500/vue-07-lifecycle&ajax/04-bootstrap-ajax/emp.json').then(response => {
                console.log(response.data) // 得到返回結果資料
                this.empList = response.data
            }).catch(error => {
                console.log(error.message)
            })
        },
        methods: {
            // 刪除指定下標的資料
            // 因為刪除 emp 會對 empList 做更新操作,
            // 而 empList 是初始化在當前這個元件裡,所以刪除的函式要定義在這個元件中
            delItem(index) {
                this.empList.splice(index, 1);
            },
            deleteHobby(index) {
                this.hobbies.splice(index, 1);
            }
        }
    }

})()
You are never too old to set another goal or to dream a new dream!!!