vue入门到精通(九)

7.2 如何定义和使用组合式函数

18_composition/91_composition_mouse_hooks.html

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='UTF-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>鼠标跟随</title>
</head>
<body>
  <div id='app'>
    鼠标的位置:({{x}}, {{y}})
  </div>
</body>
<script src='../lib/vue.global.js'></script>
<script>
    const { createApp, ref, onMounted, onUnmounted } = Vue

    function useMouse () {
      const x = ref(0)
      const y = ref(0)

      function updatePosition (event) {
        x.value = event.pageX
        y.value = event.pageY
      }

      onMounted(() => {
        window.addEventListener('mousemove', updatePosition, false)
      })

      onUnmounted(() => {
        window.removeEventListener('mousemove', updatePosition, false)
      })

      return { x, y }
    }
    
    createApp({
      setup () {
        const { x, y } = useMouse()

        return {
          x, y
        }
      }
    }).mount('#app')
</script>
</html>

如你所见,核心逻辑完全一致,我们做的只是把它移到一个外部函数中去,并返回需要暴露的状态。和在组件中一样,你也可以在组合式函数中使用所有的组合式 API。现在,useMouse() 的功能可以在任何组件中轻易复用了。

更酷的是,你还可以嵌套多个组合式函数:一个组合式函数可以调用一个或多个其他的组合式函数。

18_composition/92_composition_mouse_more_hooks.html

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='UTF-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>鼠标跟随</title>
</head>
<body>
  <div id='app'>
    鼠标的位置:({{x}}, {{y}})
  </div>
</body>
<script src='../lib/vue.global.js'></script>
<script>
    const { createApp, ref, onMounted, onUnmounted } = Vue

    function useEventListener (target, event, callback) {
      onMounted(() => {
        target.addEventListener(event, callback, false)
      })

      onUnmounted(() => {
        target.removeEventListener(event, callback, false)
      })
    }

    function useMouse () {
      const x = ref(0)
      const y = ref(0)

      // function updatePosition (event) {
      //   x.value = event.pageX
      //   y.value = event.pageY
      // }

      // onMounted(() => {
      //   window.addEventListener('mousemove', updatePosition, false)
      // })

      // onUnmounted(() => {
      //   window.removeEventListener('mousemove', updatePosition, false)
      // })

      useEventListener(window, 'mousemove', (event) => {
        x.value = event.pageX
        y.value = event.pageY
      })

      return { x, y }
    }
    
    createApp({
      setup () {
        const { x, y } = useMouse()

        return {
          x, y
        }
      }
    }).mount('#app')
</script>
</html>

7.3 异步状态

在做异步数据请求时,我们常常需要处理不同的状态:加载中、加载成功和加载失败。

18_composition/93_composition_async.html

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='UTF-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>异步状态</title>
</head>
<body>
  <div id='app'>
    <div v-if="error">{{ error }}</div>
    <div v-else-if="data">
      <ul>
        <li v-for="item of data" :key="item.proid">{{ item.proname }}</li>
      </ul>
    </div>
    <div v-else>加载中....</div>
  </div>
</body>
<script src='../lib/vue.global.js'></script>
<script>
    const { createApp, ref, onMounted } = Vue
    createApp({
      setup () {
        const data = ref(null)
        const error = ref(null)

        onMounted(() => {
          // http://121.89.205.189:3000/apidoc/
          // fetch 可以用来做数据的请求,基于promise的
          // 请求到的数据需要转换为json 对象,然后再使用
          fetch('http://121.89.205.189:3000/api/pro/list')
            .then(res => { return res.json() }) // 转换为json格式
            .then(res => {
              console.log(res)
              data.value = res.data
            }).catch(err => {
              error.value = err
            })
        })

        return {
          data, error
        }
      }
    }).mount('#app')
</script>
</html>

如果在每个需要获取数据的组件中都要重复这种模式,那就太繁琐了。让我们把它抽取成一个组合式函数:

18_composition/94_composition_async_hooks.html

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='UTF-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0'>
    <title>异步状态</title>
</head>
<body>
  <div id='app'>
    <div v-if="error">{{ error }}</div>
    <div v-else-if="data">
      <ul>
        <li v-for="item of data" :key="item.proid">{{ item.proname }}</li>
      </ul>
    </div>
    <div v-else>加载中....</div>
  </div>
</body>
<script src='../lib/vue.global.js'></script>
<script>
    const { createApp, ref, onMounted } = Vue

    function useFetch (url) {
      const data = ref(null)
        const error = ref(null)

        onMounted(() => {
          // http://121.89.205.189:3000/apidoc/
          // fetch 可以用来做数据的请求,基于promise的
          // 请求到的数据需要转换为json 对象,然后再使用
          fetch(url)
            .then(res => { return res.json() }) // 转换为json格式
            .then(res => {
              console.log(res)
              data.value = res.data
            }).catch(err => {
              error.value = err
            })
        })

      return { data, error }
    }

    createApp({
      setup () {
        
        const { data, error } = useFetch('http://121.89.205.189:3000/api/pro/list')
        return {
          data, error
        }
      }
    }).mount('#app')
</script>
</html>

useFetch() 接收一个静态的 URL 字符串作为输入,所以它只执行一次请求,然后就完成了。但如果我们想让它在每次 URL 变化时都重新请求呢?那我们可以让它同时允许接收 ref 作为参数:

95_composition_async_hooks_urls.html - 思考题


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue入门精通》是一本关于Vue.js前端框架的学习指南。本书分为入门、进阶和精通三个部分,帮助读者从零基础开始学习,并逐步掌握Vue.js的核心概念和应用技巧。 在入门部分,书中首先介绍了Vue.js的基本概念,如组件、数据绑定、指令等。读者将学会如何搭建Vue项目、编写Vue组件,并了解Vue的基本语法和工作原理。通过实例演示和练习题,读者可以巩固对Vue基础知识的理解和掌握,为后续的学习打下坚实的基础。 进阶部分则重点讲解了Vue的高级特性和常用技巧。读者将学会如何使用Vue Router进行路由管理、Vuex进行状态管理、以及Vue CLI进行项目构建。此外,该部分还包括了对Vue的响应式原理、性能优化和国际化等方面的深入讲解,帮助读者进一步提升开发能力。 在精通部分,书中通过案例实战、源码解析等方式,深入剖析Vue.js的内部机制和高级用法。读者将学会如何进行自定义指令、混入(mixin)、过滤器(filter)等高级扩展,以及如何优化大型项目的性能和可维护性。此外,书中还介绍了与第三方库、服务端渲染等相关的内容,帮助读者更进一步地掌握和应用Vue.js。 总之,《Vue入门精通》是一本循序渐进、实例丰富的Vue.js学习教材,适合从零开始学习Vue.js的前端开发者。通过系统地学习该书,读者可以逐步掌握Vue.js的核心知识和实际应用技巧,提升自己在前端开发领域的竞争力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值