老师我想请问下为什么有些自定义函数里面拿不到vue相关的东西

来源:6-13 Composition API 如何实现逻辑复用

晓白菜菜

2021-03-27

import { useRoute, useRouter } from 'vue-router'
import { useStore } from 'vuex'

// 自定义函数
const getUserInfo = () => {
    const { commit } = useStore()  // 报错,没有useStore这个玩意
    const route = useRoute()       // 报错,没有路由这玩意
    const router = useRouter()     // 报错,没有路由这玩意
    // 没有办法拿不到只能从外部传递进来了  commit,route,router.....
    // ...省略一堆代码,比如存储数据,请求其他接口,跳转页面

}

// 普通点击按钮登录逻辑
export const useSubmitLogin = () => {
	// 这里面不报错,能拿到vue相关的东西
    const { commit } = useStore() 
    const route = useRoute()
    const router = useRouter()
    const submit = async () => {
        // 这里面处理登录
        try {
            const data = await login()
            message.success('登录成功')
            // 登录成功后调用获取用户信息接口,这个接口里面有存储用户数据和跳转路由相关逻辑
            /* 
                问题来了这个getUserInfo函数里面拿不到和vue相关的东西,比如store和路由,
                我只有从这个传递参数才能拿到,如果这个参数很多,一个个传递很麻烦
                其实我是想知道为什么这个useSubmitLogin能拿到vue相关的东西
                而这个getUserInfo就拿不到呢
            */
            getUserInfo(commit, route, router)
        } catch (e) {}
    }
    return {
        submit,
    }
}

/* 
这里是vue的页面
*/

import useSubmitLogin from './test'
setup() {
    const { submit } = useSubmitLogin()
    return{
        submit,
    }
}


写回答

2回答

双越

2021-03-29

我又查了查资料,忽然发现自己忽略了一个细节,就是:Vue3 要求,钩子函数(useStore useRoute等)必须在 setup 时触发。你的第一个函数没有用到 setup 中,所以报错了。

非常抱歉,这个疏忽导致问题拖了好几天~

1
1
晓白菜菜
非常感谢!
2021-03-29
共1条回复

双越

2021-03-28

在拿不到的地方,如 useStore useRouter 等,你打印一下这个函数是啥?看看打印结果

另外,自定义函数最后要有 return

0
7
晓白菜菜
回复
双越
没有return,这个函数就是处理一些逻辑,不需要return,而且就算我return了也是不得行,这个函数就是我点击按钮请求登录接口成功之后调用,反正就是我在点击事件里面调用,如果正常调用就能拿到vue相关的东西
2021-03-29
共7条回复

2024版 前端框架及项目面试 聚焦Vue3/React/Webpack

面向1-3年前端的框架及项目面试“刚需内容”

4663 学习 · 1644 问题

查看课程