【Vue3从零开始-实战】S11:setup函数的职责及封装setup函数中的逻辑

简介: 【Vue3从零开始-实战】S11:setup函数的职责及封装setup函数中的逻辑

@@DVBVTGC2D7ROIYF4YK_@O.png


前言


实战已经开始了!上一篇文章中我们把Toast组件拆分出来了,并且把其中的逻辑部分也从Login组件中的setup函数中拆分到其组件中去。


其实一个setup函数主要是做什么呢?它的职责又是干啥呢?和vue2中的methods方法有什么区别呢?


在setup函数中,可以用物以类聚人以群分来形容我们的代码逻辑,也就是关于某一块的东西可以放在一起去管理。然而我们在Login.vue页面里面写的代码还不算完全物以类聚了,有些地方还是比较分散的。所以下面我们就需要去把setup函数中的逻辑都分门别类的拆分出来。


拆分Login逻辑


👉 在拆分之前,我们要明确一点,哪些属于Login的逻辑模块。


👉 我们在Login组件页面会发现,有两个input输入框需要进行双向数据绑定,还需要请求mock接口进行登录,最后将错误提示通过Toast组件显示出来。


👉 按照这个逻辑,我们就先将数据绑定的提取出来。


👉 为了更好的绑定数据,我们需要使用以前学过的toRefs方法去解构data里面的值,所以要先引用toRefs


import { reactive, toRefs } from 'vue'
复制代码


👉 拆分Login逻辑部分还需要将它剥离出setup函数,所以需要在js中新建一个函数来封装Login的逻辑部分。


const useLoginEffect = (showToast) => {
    const router = useRouter()
    const data = reactive({ mobile: '', password: '' })
    const handleLogin = async () => {
        try {
            const result = await post('/api/user/login', {
                username: data.username,
                password: data.password
            })
            if (result.data.code === 0) {
                localStorage.isLogin = true
                router.push({ name: 'Home' })
            } else {
                showToast('登陆失败')
            }
        } catch (e) {
            showToast('请求失败')
        }
    }
    const { mobile, password } = toRefs(data)
    return { handleLogin, mobile, password }
}
复制代码


  • useLoginEffect函数接收外部传递过来的showToast方法。


  • 将数据值return出去之前,需要将输入框绑定的值从data中解构出来,这样在页面中就可以直接使用解构出来的值了,不需要通过data.xxx的方式来绑定了。


<div class="wrapper__input">
  <input class="wrapper__input__content" placeholder="请输入手机号" v-model="mobile" />
</div>
<div class="wrapper__input">
  <input class="wrapper__input__content" placeholder="请输入密码" v-model="password" />
</div>
复制代码


👉 拆分跳转注册的逻辑


// 处理注册跳转
const useRegisterEffect = () => {
  const router = useRouter()
  const handleRegisterClick = () => {
    router.push({ name: 'Register' })
  }
  return { handleRegisterClick }
}
复制代码


👉 在setup函数中就可以像获取Toast组件中的数据一样获取封装的Login逻辑了。


setup () {
    const router = useRouter()
    const { toastData, showToast } = useToastEffect()
    const { mobile, password, handleLogin } = useLoginEffect(showToast)
    const handleRegisterClick = () => {
      router.push({ name: 'Register' })
    }
    return { handleLogin, handleRegisterClick, mobile, password, toastData }
}
复制代码


  • 通过解构useLoginEffect方法,得到的数据值在通过setup函数return到外部使用。


🔆 这样拆分之后,setup函数里面的代码就会一目了然,需要修改某个部分的逻辑就直接找到对应的函数即可。不需要再像之前一样,数据和逻辑可能中间还插入了其他代码。


😲 登录页面中的逻辑都拆分完成了,我们也可以把注册的逻辑像登录一样去完善,并且调用mock接口。


注册逻辑


👉 在fastmock上新建注册接口


%G92)3OTK}TXJ5NWO4PWZM9.png


👉 注册组件中引入所需的模块


import { useRouter } from 'vue-router'
import { reactive, toRefs } from 'vue'
import { post } from '../../utils/request'
import Toast, { useToastEffect } from '../../components/Toast'
复制代码


👉 注册逻辑就不写在setup中了,直接就拆分成一个单独的方法


// 处理注册相关逻辑
const useRegisterEffect = (showToast) => {
  const router = useRouter()
  const data = reactive({
    mobile: '',
    password: '',
    ensurement: ''
  })
  const handleRegister = async () => {
    try {
      const result = await post('/api/user/register', {
        mobile: data.mobile,
        password: data.password
      })
      if (result.data.code === 0) {
        router.push({ name: 'Login' })
      } else {
        showToast('注册失败')
      }
    } catch (e) {
      showToast('请求失败')
    }
  }
  const { mobile, password, ensurement } = toRefs(data)
  return { mobile, password, ensurement, handleRegister }
}
复制代码


  • 注册逻辑和登录差不多,只是多了一个参数而已,接口名是新建的注册接口。


👉 将注册逻辑中的数据绑定到input输入框中


<div class="wrapper__input">
  <input class="wrapper__input__content" placeholder="请输入手机号" v-model="mobile" />
</div>
<div class="wrapper__input">
  <input class="wrapper__input__content" placeholder="请输入密码" type="password" v-model="password" />
</div>
<div class="wrapper__input">
  <input class="wrapper__input__content" placeholder="确认密码" type="password" v-model="ensurement" />
</div>
复制代码


👉 注册页还有一个跳转登录逻辑,也可以拆分出来


// 处理登陆跳转
const useLoginEffect = () => {
  const router = useRouter()
  const handleLoginClick = () => {
    router.push({ name: 'Login' })
  }
  return { handleLoginClick }
}
复制代码


👉 setup函数调用封装的逻辑方法


setup () {
    const { toastData, showToast } = useToastEffect()
    const { mobile, password, ensurement, handleRegister } = useRegisterEffect(showToast)
    const { handleLoginClick } = useLoginEffect()
    return {
      mobile,
      password,
      ensurement,
      toastData,
      handleRegister,
      handleLoginClick
    }
}
复制代码


V[]S}[AL7$F31WRRH47M8U9.png


总结


本篇文章主要讲解了setup函数的职责,就是为了方便我们知道代码执行的一个流程而已,没有过多的逻辑代码。所有的逻辑代码都可以封装在setup函数外部,然后进行引用或者调用之后再return给其他逻辑部分使用或者页面使用。

相关文章
|
4天前
|
JavaScript
Vue中组件化编码 完成任务的添加、删除、统计、勾选需求(实战练习三完结)
这篇文章展示了如何在Vue中实现任务添加、删除、勾选和统计功能,通过组件间参数传递和方法实现,提供了App.vue、TheList.vue、TheItem.vue、TheHeader.vue和TheFooter.vue组件的主要代码示例。
Vue中组件化编码 完成任务的添加、删除、统计、勾选需求(实战练习三完结)
|
4天前
|
JavaScript
Vue中组件化编码使用(实战练习一)
这篇文章是关于Vue中组件化编码的实战练习,介绍了组件化编码的流程、组件间参数传递的方法以及如何通过组件配合完成一个需求。内容包括了组件拆分、动态组件实现、交互绑定事件的步骤,以及使用props进行父子组件通信的注意事项。文章还提供了一个待办事项列表的静态页面效果和相关代码示例,包括TheFooter.vue、TheHeader.vue、TheItem.vue、TheList.vue和App.vue等组件的代码。
Vue中组件化编码使用(实战练习一)
|
4天前
Vue3使用createVNode和render函数实现仿 Antd 加载动效
本文展示了如何在Vue3项目中使用`createVNode`和`render`函数实现一个仿Ant Design加载动效的自定义组件,并提供了详细的实现代码和使用示例。
8 0
Vue3使用createVNode和render函数实现仿 Antd 加载动效
|
4天前
|
数据采集 JavaScript
Vue中组件化编码使用、实现组件之间的参数传递(实战练习二)
这篇文章介绍了Vue中组件化编码的实现和组件间参数传递的方法,通过实战练习展示了从App.vue向TheList.vue和TheItem.vue传递数据的流程和代码示例。
|
3天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
3天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
3天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
3天前
|
JavaScript 编译器
成功解决:Module build failed: Error: Vue packages version mismatch
这篇文章记录了解决Vue项目中遇到的"Module build failed: Error: Vue packages version mismatch"错误的步骤,原因是项目中Vue依赖的版本不一致,解决方法是删除`node_modules`后重新安装指定版本的Vue和`vue-template-compiler`,确保版本匹配,最终成功运行项目。
成功解决:Module build failed: Error: Vue packages version mismatch
|
3天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用
|
3天前
|
JavaScript
Vue devDependencies 与 dependencies 能别
Vue devDependencies 与 dependencies 能别
10 3