前言在学习ReactHooks的过程中,在网上看到一篇文章,通过Hooks请求数据,并将这个逻辑抽象成一个新的Hooks,供其他组件复用。我也写在我的博客上我翻译在这里:《在 React Hooks 中如何请求数据?》,有兴趣的可以看看。虽然是去年的文章,但是看完之后立马掌握了Hooks的使用方法,数据请求是业务代码中很常见的逻辑。Vue3已经发布有一段时间了,它的组合API多少有点ReactHooks的影子。今天也打算通过这种方式来学习组合API。项目初始化为了快速启动一个Vue3项目,我们直接使用最流行的工具Vite来初始化项目。整个过程一气呵成,行云流水。npminitvite-appvue3-app#打开生成的项目文件夹cdvue3-app#安装依赖npminstall#启动项目npmrundev我们打开App.vue,先删除生成的代码。PortfolioAPI入口接下来,我们将使用HackerNewsAPI获取一些热门文章。HackerNewsAPI返回的数据结构如下:{"hits":[{"objectID":"24518295","title":"Vue.js3","url":"https://github.com/vuejs/vue-next/releases/tag/v3.0.0",},{...},{...},]}我们通过ui>li在界面上显示新闻列表,新闻数据为通过hits遍历得到
在解释之前数据请求,让我看一下setup()方法。组合API需要通过setup()方法启动。setup()返回的数据可以在模板中使用,可以很容易理解Vue2中data()方法返回的数据,不同的是返回的数据需要通过react()方法进行包装首先使数据响应。在复合API中请求数据在Vue2中,当我们请求数据时,通常需要将发起请求的代码放入某个生命周期(created或mounted)。在setup()方法中,我们可以使用Vue3提供的生命周期钩子,将请求置于特定的生命周期中。lifecyclehook方法和之前的lifecycle对比如下:lifecycle可以看出来,基本上是在方法名前加上onon,并没有提供onCreatedhook,因为在setup()中执行的是相当于在创建阶段执行。接下来,我们在挂载阶段请求数据:https://hn.algolia.com/api/v1/search?query=vue').then(rsp=>rsp.json())state.hits=data.hits})returnstate}}最终效果如下如下:monitordataChangeHackerNews的查询接口有一个查询参数。在前面的例子中,我们固定了这个参数。现在我们通过响应式数据来定义这个变量。
现在我们可以修改输入框来触发state.query同步更新,但是不会触发fetch再次调用,所以我们需要通过watchEffect()来监听响应数据的变化。import{reactive,onMounted,watchEffect}from'vue'exportdefault{setup(){conststate=reactive({query:'vue',hits:[]})constfetchData=async(query)=>{constdata=awaitfetch(`https://hn.algolia.com/api/v1/search?query=${query}`).then(rsp=>rsp.json())state.hits=data.hits}onMounted(()=>{fetchData(state.query)watchEffect(()=>{fetchData(state.query)})})returnstate}}第一次调用watchEffect()时,会执行一次它的回调,导致请求接口初始化时两次,所以我们需要删除onMounted中的fetchData。onMounted(()=>{-fetchData(state.query)watchEffect(()=>{fetchData(state.query)})})watchEffect()会监听传入函数中的所有响应数据,一旦其中一个If任何数据更改,该功能将重新执行。如果想取消手表,可以调用watchEffect()的返回值,返回一个函数。下面是一个例子:conststop=watchEffect(()=>{if(state.query==='vue3'){//当query是vue3时,停止监听stop()}fetchData(state.query)})whenAfter我们在输入框输入“vue3”,就不会再发起请求了。return事件方法的问题在于,每次修改输入中的值时,都会触发请求。我们可以添加一个按钮,点击按钮触发state.query的更新。
你可以注意到绑定到按钮的点击事件方法,它也由setup()方法返回。我们可以把setup()方法的返回值理解为Vue2中data()方法和methods对象的组合。原来的返回值状态变成了当前返回值的一个属性,所以我们在模板层取数据的时候,需要做一些修改,加上状态。在前。
返回数据修改为强迫症患者,在template层通过state.xxx获取数据真的很不爽,那我们能不能通过对象解构来返回state数据呢?
