目錄
this.$watch(() => this.name, () => {  // 函数的返回值发生变化,进入此回调函数})复制代码
登入後複製
上文中就是Vue2.0中我們使用watch" >
this.$watch(() => this.name, () => {  // 函数的返回值发生变化,进入此回调函数})复制代码
登入後複製
上文中就是Vue2.0中我們使用watch
watchEffect的用法
Vue3.0中使用计算属性
Vue3.0中使用vue-router
初始化vue-router
setup中使用vue-router
Vue3.0中使用vuex
初始化vuex
setup中使用vuex
Vue3.0中的生命周期钩子函数
总结
结语
首頁 web前端 js教程 使用Vue3.0收穫的知識點(二)

使用Vue3.0收穫的知識點(二)

Sep 19, 2020 am 09:26 AM

使用Vue3.0收穫的知識點(二)

日日加班日忙,需求襲來如虎狼。測驗問題堆如山,萬念俱灰歸故鄉。

相關學習推薦:javascript

#最近在工作之餘一直學習Vue3.0相關知識,雖然Vue3.0至今還是rc版,但這並不影響我們去學習。今天這篇文章是我關於Vue3.0的第四篇文章。在前文中我們講解瞭如何透過vitevuecli建構Vue3.0開發環境,然後介紹了Vue3.0中的setup,reactive,ref等,今天這篇文章主要講解了以下內容:

  1. Vue3.0 中使用watch
  2. Vue3.0中使用計算屬性
  3. Vue3.0中使用vue-router
  4. Vue3.0中使用vuex

開始本文前,小編提供了一個Vue3.0開發環境,倉庫位址為gitee.com/f_zijun/vue…,歡迎使用。本文首刊於公眾號【前端有的玩】,這是一個專注於Vue面試相關的公眾號,提升自己的市場競爭力,就在【前端有的玩】。同時點選以下連結即可存取小編關於Vue3.0的其他相關文章

#學習Vue3.0,先來了解Proxy

使用vite建構一個Vue3.0學習環境

使用Vue3.0收穫的知識點(一)

# #Vue3.0中使用watch

    watch
  1. Vue3.0

    中並不是新的概念,在使用

    Vue2.x的時候,我們常常會使用watch來監聽Vue實例上面的一個表達式或一個函數計算結果的變化。 回顧Vue2.0中的watch

  2. Vue2.0中,我們使用watch

    可以透過下面多種方式去監聽

    Vue實例上面的表達式或函數計算​​結果的變化,如下羅列了其中的幾種最常規使用方式

    export default {
      data() {    return {      name: '子君',      info: {        gzh: '前端有的玩'
          }
        }
      },  watch: {
        name(newValue, oldValue) {      console.log(newValue, oldValue)
        },    'info.gzh': {
          handler(newValue, oldValue) {        console.log(newValue, oldValue)
          },      // 配置immediate会在watch之后立即执行
          immediate: true
        }
      }
    }复制代码
    登入後複製
    我們可以在watch屬性裡面配置要監聽的Vue

    實例上面的屬性,也可以透過
  3. .
  4. 鍵路徑去監聽物件中的某一個屬性的變化,也可以透過配置

    immediate

    在監聽後立即觸發,配置

    deep去深度監聽物件裡面的屬性,不論嵌套層級有多深。

    使用$watch監聽除了常規的watch物件寫法之外,Vue實例上面提供了$watch方法,可以透過$watch更靈活的去監聽某一個屬性的變化。例如這樣一個場景,我們有一個表單,然後希望在使用者修改表單之後可以監聽到表單的資料變化。但有一個特別的場景,就是表單的回填資料是異步請求過來的,這時候我們希望在後台請求完資料之後再去監聽變化,這時候就可以使用$watch。如下程式碼所示:

    export default {  methods: {
        loadData() {
          fetch().then(data => {        this.formData = data        this.$watch(          'formData',
              () => {            // formData数据发生变化后会进入此回调函数
              },
              {            deep: true
              }
            )
          })
        }
      }
    }复制代码
    登入後複製
    監聽函數表達式

    除了監聽字串之外,
  5. $watch
的第一個參數也可以是一個函數,當函數的回傳值改變之後,觸發回呼函數

this.$watch(() => this.name, () => {  // 函数的返回值发生变化,进入此回调函数})复制代码
登入後複製
上文中就是Vue2.0中我們使用watch

的一些常用寫法,對於

Vue3.0,因為其對Vue2.0做了部分的向下相容,所以上面的用法在Vue3.0中基本上都可以使用,但是Vue3.0一個很大的亮點就是composition API,所以除了Vue2.0中的寫法之外,也可以使用componsition api中提供的watchVue3.0中使用watch

Vue3.0中,除了Vue2.0

的寫法之外,有兩個

api可以對資料變化進行監聽,第一種是watch

,第二種是###watchEffect###。對於###watch###,其與###Vue2.0###中的###$watch###用法基本上是一模一樣的,而###watchEffect###是###Vue3. 0###新提供的###api#########watch的用法######下面的範例示範如何使用###watch######
import { watch, ref, reactive } from 'vue'export default {
  setup() {    const name = ref('子君')    const otherName = reactive({      firstName: '王',      lastName: '二狗'
    })
    watch(name, (newValue, oldValue) => {      // 输出 前端有的玩 子君
      console.log(newValue, oldValue)
    })    // watch 可以监听一个函数的返回值
    watch(      () => {        return otherName.firstName + otherName.lastName
      },
      value => {        // 当otherName中的 firstName或者lastName发生变化时,都会进入这个函数
        console.log(`我叫${value}`)
      }
    )

    setTimeout(() => {
      name.value = '前端有的玩'
      otherName.firstName = '李'
    }, 3000)
  }
}复制代码
登入後複製
### ###watch###除了可以監聽單一值或函數回傳值之外,也可以同時監聽多個資料來源,例如下方程式碼所示:###
export default {
  setup() {    const name = ref('子君')    const gzh = ref('前端有的玩')
    watch([name, gzh], ([name, gzh], [prevName, prevGzh]) => {      console.log(prevName, name)      console.log(prevGzh, gzh)
    })

    setTimeout(() => {
      name.value = '前端有的玩'
      gzh.value = '关注我,一起玩前端'
    }, 3000)
  }
}复制代码
登入後複製
watchEffect的用法

watchEffect的用法与watch有所不同,watchEffect会传入一个函数,然后立即执行这个函数,对于函数里面的响应式依赖会进行监听,然后当依赖发生变化时,会重新调用传入的函数,如下代码所示:

import { ref, watchEffect } from 'vue'export default {
  setup() {    const id = ref('0')
    watchEffect(() => {      // 先输出 0 然后两秒后输出 1
      console.log(id.value)
    })

    setTimeout(() => {
      id.value = '1'
    }, 2000)
  }
}复制代码
登入後複製
  1. 停止执行

    Vue2.0中的$watch会在调用的时候返回一个函数,执行这个函数可以停止watch,如下代码所示

    const unwatch = this.$watch('name',() => {})// 两秒后停止监听setTimeout(()=> {
      unwatch()
    }, 2000)复制代码
    登入後複製

    Vue3.0中,watchwatchEffect同样也会返回一个unwatch函数,用于取消执行,比如下面代码所示

    export default {
      setup() {    const id = ref('0')    const unwatch = watchEffect(() => {      // 仅仅输出0
          console.log(id.value)
        })
    
        setTimeout(() => {
          id.value = '1'
        }, 2000)    // 1秒后取消watch,所以上面的代码只会输出0
        setTimeout(() => {
          unwatch()
        }, 1000)
      }
    }复制代码
    登入後複製
    1. 清除副作用

      想象一下这样的一个场景,界面上面有两个下拉框,第二个下拉框的数据是根据第一个下拉框的数据联动的,当第一个下拉框数据发生变化后,第二个下拉框的数据会通过发送一个网络请求进行获取。这时候我们可以通过watchEffect来实现这个功能,比如像下面代码这样

      import { ref, watchEffect } from 'vue'function loadData(id) {  return new Promise(resolve => {
          setTimeout(() => {
            resolve(        new Array(10).fill(0).map(() => {          return id.value + Math.random()
              })
            )
          }, 2000)
        })
      }export default {
        setup() {    // 下拉框1 选中的数据
          const select1Id = ref(0)    // 下拉框2的数据
          const select2List = ref([])
          watchEffect(() => {      // 模拟请求
            loadData(select1Id).then(data => {
              select2List.value = data        console.log(data)
            })
          })    
          // 模拟数据发生变化
          setInterval(() => {
            select1Id.value = 1
          }, 3000)
        }
      }复制代码
      登入後複製

      现在假如我切换了一下第一个下拉框的数据之后,这时候数据请求已经发出,然后我将这个页面切换到另一个页面,因为请求已经发出,所以我希望在页面离开的时候,可以结束这个请求,防止数据返回后出现异常,这时候就可以使用watchEffect为第一个回调函数传入的入参来处理这个情况,如下代码所示

      function loadData(id, cb) {  return new Promise(resolve => {    const timer = setTimeout(() => {
            resolve(        new Array(10).fill(0).map(() => {          return id.value + Math.random()
              })
            )
          }, 2000)
          cb(() => {
            clearTimeout(timer)
          })
        })
      }export default {
        setup() {    // 下拉框1 选中的数据
          const select1Id = ref(0)    // 下拉框2的数据
          const select2List = ref([])
          watchEffect(onInvalidate => {      // 模拟请求
            let cancel = undefined
            // 第一个参数是一个回调函数,用于模拟取消请求,关于取消请求,可以了解axios的CancelToken
            loadData(select1Id, cb => {
              cancel = cb
            }).then(data => {
              select2List.value = data        console.log(data)
            })
            onInvalidate(() => {
              cancel && cancel()
            })
          })
        }
      }复制代码
      登入後複製

Vue3.0中使用计算属性

想一想在Vue2.0中我们一般会用计算属性做什么操作呢?我想最常见的就是当模板中有一个复杂计算的时候,可以先使用计算属性进行计算,然后再在模板中使用,实际上,Vue3.0中的计算属性的作用和Vue2.0的作用基本是一样的。

  1. Vue2.0中使用计算属性

      computed: {
        getName() {      const { firstName, lastName } = this.info      return firstName + lastName
        }
      },复制代码
    登入後複製
  1. Vue3.0中使用计算属性

    <template>  <p class="about">
        <h1>{{ name }}</h1>
      </p></template>
    <script>
    import { computed, reactive } from &#39;vue&#39;
    
    export default {
      setup() {
        const info = reactive({
          firstName: &#39;王&#39;,
          lastName: &#39;二狗&#39;
        })
    
        const name = computed(() => info.firstName + info.lastName)
    
        return {
          name
        }
      }
    }
    </script>复制代码
    登入後複製

    Vue2.0一样,Vue3.0的计算属性也可以设置gettersetter,比如上面代码中的计算属性,只设置了getter,即加入cumputed传入的参数是一个函数,那么这个就是getter,假如要设置setter,需要像下面这样去写

    export default {
      setup() {    const info = reactive({      firstName: &#39;王&#39;,      lastName: &#39;二狗&#39;
        })    const name = computed({      get: () => info.firstName + &#39;-&#39; + info.lastName,
          set(val) {        const names = val.split(&#39;-&#39;)
            info.firstName = names[0]
            info.lastName = names[1]
          }
        })    return {
          name
        }
      }
    }复制代码
    登入後複製

Vue3.0中使用vue-router

初始化vue-router

Vue2.0中我们使用vue-router的时候,会通过new VueRouter的方式去实现一个VueRouter实例,就像下面代码这样

import Vue from &#39;vue&#39;import VueRouter from &#39;vue-router&#39;Vue.use(VueRouter)const router = new VueRouter({  mode: &#39;history&#39;,  routes: []
})export default router复制代码
登入後複製

但到了Vue3.0,我们创建VueRouter的实例发生了一点点变化,就像Vue3.0main.js中初始化Vue实例需要像下面写法一样

import { createApp } from &#39;vue&#39;createApp(App).$mount(&#39;#app&#39;)复制代码
登入後複製

vue-router也修改为了这种函数的声明方式

import { createRouter, createWebHashHistory } from &#39;vue-router&#39;const router = createRouter({  // vue-router有hash和history两种路由模式,可以通过createWebHashHistory和createWebHistory来指定
  history: createWebHashHistory(),
  routes
})

router.beforeEach(() => {
  
})

router.afterEach(() => {
  
})export default router复制代码
登入後複製

然后在main.js中,通过

 createApp(App).use(router)复制代码
登入後複製

来引用到Vue

setup中使用vue-router

Vue2.0中,我们通过this.$route可以获取到当前的路由,然后通过this.$router来获取到路由实例来进行路由跳转,但是在setup中,我们是无法拿到this的,这也意味着我们不能像Vue2.0那样去使用vue-router, 此时就需要像下面这样去使用

import { useRoute, useRouter } from &#39;vue-router&#39;export default {
  setup() {    // 获取当前路由
    const route = useRoute()    // 获取路由实例
    const router = useRouter()    // 当当前路由发生变化时,调用回调函数
    watch(() => route, () => {      // 回调函数
    }, {      immediate: true,      deep: true
    })    
    // 路由跳转
    function getHome() {
      router.push({        path: &#39;/home&#39;
      })
    }    
    return {
      getHome()
    }
  }
}复制代码
登入後複製

上面代码我们使用watch来监听路由是否发生变化,除了watch之外,我们也可以使用vue-router提供的生命周期函数

import { onBeforeRouteUpdate, useRoute } from &#39;vue-router&#39;export default {
  setup() {
    onBeforeRouteUpdate(() => {      // 当当前路由发生变化时,调用回调函数
    })
  }
}复制代码
登入後複製

除了onBeforeRouteUpdate之外,vue-router在路由离开的时候也提供了一个生命周期钩子函数

onBeforeRouteLeave(() => {   console.log(&#39;当当前页面路由离开的时候调用&#39;)
})复制代码
登入後複製

Vue3.0中使用vuex

其实vuexVue3.0中的使用方式和vue-router基本是一致的

初始化vuex

首先新建store/index.js,然后添加如下代码

import { createStore } from &#39;vuex&#39;export default createStore({  state: {},  mutations: {},  actions: {}
})复制代码
登入後複製

然后在main.js中,通过以下方式使用

 createApp(App).use(store)复制代码
登入後複製

setup中使用vuex

useRouter一样,vuex也提供了useStore供调用时使用,比如下面这段代码

import { useStore } from &#39;vuex&#39;export default {
  setup() {
    const store = useStore()
    const roleMenus = store.getters[&#39;roleMenus&#39;]
    return {
      roleMenus
    }
  }
}复制代码
登入後複製

其余的使用方式基本和Vue2.0中的用法是一致的,大家具体可以参考vuex官方文档

Vue3.0中的生命周期钩子函数

在前文中,我们说到Vue3.0是兼容一部分Vue2.0的,所以对于Vue2.0的组件写法,生命周期钩子函数并未发生变化,但是假如你使用的是componsition api,那么就需要做一部分调整

  1. 取消beforeCreatecreated

    在使用componsition api的时候,其实setup就代替了beforeCreatecreated,因为setup就是组件的实际入口函数。

  2. beforeDestroydestroyed 改名了

    setup中,beforeDestroy更名为onBeforeUnmount,destroyed更名为onUnmounted

  3. 将生命周期函数名称变为on+XXX,比如mounted变成了onMounted,updated变成了onUpdated

setup中使用生命周期函数的方式

setup() {
    onMounted(() => {      console.log(&#39;mounted!&#39;)
    })
    onUpdated(() => {      console.log(&#39;updated!&#39;)
    })
    onUnmounted(() => {      console.log(&#39;unmounted!&#39;)
    })
  }复制代码
登入後複製

实际用法与Vue2.0基本是一致的,只是写法发生了变化,所以学习成本是很低的。

总结

这是小编关于Vue3.0的第四篇文章,每一篇文章都是自己在学习中做的一些总结。小编整理了一个vue3.0的开发环境,仓库地址为 gitee.com/f_zijun/vue…,内部集成了typescript,eslint,vue-router,vuex,ant desigin vue等,希望可以帮到正在学习Vue3.0的你,同时关注公众号【前端有的玩】,带给你不一样的惊喜。喜欢本文,可以给小编一个赞哦。

结语

不要吹灭你的灵感和你的想象力; 不要成为你的模型的奴隶。 ——文森特・梵高

以上是使用Vue3.0收穫的知識點(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1669
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

了解JavaScript引擎:實施詳細信息 了解JavaScript引擎:實施詳細信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:社區,圖書館和資源 Python vs. JavaScript:社區,圖書館和資源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python vs. JavaScript:開發環境和工具 Python vs. JavaScript:開發環境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C/C在JavaScript口譯員和編譯器中的作用 C/C在JavaScript口譯員和編譯器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

See all articles