当前位置: 首页 > wzjs >正文

百达翡丽手表网站快速学制作网站

百达翡丽手表网站,快速学制作网站,学生网站建设的基本流程,做外贸的免费网站有哪些昨天参加了次视频面试,慢慢可以查漏补缺,继续学习Vue相关的知识,考虑找个实际的开源项目。 逻辑复用 组合式函数 在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。 无状态的…

昨天参加了次视频面试,慢慢可以查漏补缺,继续学习Vue相关的知识,考虑找个实际的开源项目。

逻辑复用

组合式函数

Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。

无状态的逻辑:它在接收一些输入后立刻返回所期望的输出
有状态的逻辑:负责管理会随时间而变化的状态,比如跟踪当前鼠标在页面中的位置

鼠标跟踪器示例

直接使用

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'const x = ref(0)
const y = ref(0)function update(event) {x.value = event.pageXy.value = event.pageY
}onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
</script><template>Mouse position is at: {{ x }}, {{ y }}</template>

组合式函数

// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'// 按照惯例,组合式函数名以“use”开头
export function useMouse() {// 被组合式函数封装和管理的状态const x = ref(0)const y = ref(0)// 组合式函数可以随时更改其状态。function update(event) {x.value = event.pageXy.value = event.pageY}// 一个组合式函数也可以挂靠在所属组件的生命周期上// 来启动和卸载副作用onMounted(() => window.addEventListener('mousemove', update))onUnmounted(() => window.removeEventListener('mousemove', update))// 通过返回值暴露所管理的状态return { x, y }
}

在组件中使用的方式

<script setup>
import { useMouse } from './mouse.js'const { x, y } = useMouse()
</script><template>Mouse position is at: {{ x }}, {{ y }}</template>

可以嵌套多个组合式函数

// event.js
import { onMounted, onUnmounted } from 'vue'export function useEventListener(target, event, callback) {// 如果你想的话,// 也可以用字符串形式的 CSS 选择器来寻找目标 DOM 元素onMounted(() => target.addEventListener(event, callback))onUnmounted(() => target.removeEventListener(event, callback))
}
// mouse.js
import { ref } from 'vue'
import { useEventListener } from './event'export function useMouse() {const x = ref(0)const y = ref(0)useEventListener(window, 'mousemove', (event) => {x.value = event.pageXy.value = event.pageY})return { x, y }
}
异步状态示例

带参数的组合函数

未抽取组合函数前

<script setup>
import { ref } from 'vue'const data = ref(null)
const error = ref(null)fetch('...').then((res) => res.json()).then((json) => (data.value = json)).catch((err) => (error.value = err))
</script><template><div v-if="error">Oops! Error encountered: {{ error.message }}</div><div v-else-if="data">Data loaded:<pre>{{ data }}</pre></div><div v-else>Loading...</div>
</template>

抽取组合逻辑

// fetch.js
import { ref } from 'vue'export function useFetch(url) {const data = ref(null)const error = ref(null)fetch(url).then((res) => res.json()).then((json) => (data.value = json)).catch((err) => (error.value = err))return { data, error }
}

外部使用

<script setup>
import { useFetch } from './fetch.js'const { data, error } = useFetch('...')
</script>

类似网络请求的API封装

接收响应式状态

useFetch() 接收一个静态 URL 字符串作为输入——因此它只会执行一次 fetch 并且就此结束。如果我们想要在 URL 改变时重新 fetch 呢?为了实现这一点,我们需要将响应式状态传入组合式函数,并让它基于传入的状态来创建执行操作的侦听器。

传一个ref

const url = ref('/initial-url')const { data, error } = useFetch(url)// 这将会重新触发 fetch
url.value = '/new-url'

或者接收一个getter函数

// 当 props.id 改变时重新 fetch
const { data, error } = useFetch(() => `/posts/${props.id}`)

可以用 watchEffect()toValue() API 来重构我们现有的实现

// fetch.js
import { ref, watchEffect, toValue } from 'vue'export function useFetch(url) {const data = ref(null)const error = ref(null)const fetchData = () => {// reset state before fetching..data.value = nullerror.value = nullfetch(toValue(url)).then((res) => res.json()).then((json) => (data.value = json)).catch((err) => (error.value = err))}watchEffect(() => {fetchData()})return { data, error }
}

toValue() 使3.3版本新增的API。设计目的是将refgetter规范化为值

是一个分段函数

  1. 当参数是ref类型,返回ref的值
  2. 当参数是函数,调用函数并返回其返回值
  3. 返回原参数

watchEffectVue 3 引入的一个函数,它会立即执行传入的函数,并响应式地追踪函数内部依赖的所有响应式数据,这里就是会跟踪url的变化

小结

  1. 带实现带参数的响应式组合函数,可以传refgetter
  2. toValue函数可以接收静态 URL 字符串、refgetter
  3. watchEffect函数会立即执行传入的函数,并响应式的追踪函数内部依赖的所有响应式数据
约定和最佳实践
命名

组合式函数约定用驼峰命名法命名,并以“use”作为开头。

输入参数

即便不依赖于 refgetter 的响应性,组合式函数也可以接收它们作为参数。如果你正在编写一个可能被其他开发者使用的组合式函数,最好处理一下输入参数是 refgetter 而非原始值的情况。可以利用 toValue() 工具函数来实现:

import { toValue } from 'vue'function useFeature(maybeRefOrGetter) {// 如果 maybeRefOrGetter 是一个 ref 或 getter,// 将返回它的规范化值。// 否则原样返回。const value = toValue(maybeRefOrGetter)
}

为了正确追踪,请确保要么使用 watch() 显式地监视 refgetter,要么在 watchEffect() 中调用 toValue()

返回值

组合式函数始终返回一个包含多个 ref 的普通的非响应式对象,而不是reactive,这样该对象在组件中被解构为 ref 之后仍可以保持响应性

从组合式函数返回一个响应式对象会导致在对象解构过程中丢失与组合式函数内状态的响应性连接。与之相反,ref 则可以维持这一响应性连接。

ref() 与 reactive()

两者都用于跟踪其参数的更改。

不同之处

  1. ref()函数可以接受原始类型(最常见的是布尔值,字符串和数字)以及对象作为参数,而reactive()函数只能接受对象作为参数
  2. ref()有一个.value 属性,必须使用.value属性获取内容,但是使用reactive()可以直接访问
  3. 使用ref()函数可以替换整个对象实例,但是在使用reactive()函数时就不行

关于第2个的差异如下

// 有效
const x = reactive({ name: 'John'})
x.name = 'Amy'
// x => { name: 'Ammy' }// 有效
const x = ref({ name: 'John'})
x.value.name = 'Amy'
// x.value => { name: 'Ammy' }

第3点就是返回值用ref

// 无效 - x 的更改不会被 Vue 记录
let x = reactive({name: 'John'})
x = reactive({todo: true})// 有效
const x = ref({name: 'John'})
x.value = {todo: true}

我理解的就是把原始的数据给出去,交给接收者考虑就好

const mouse = reactive(useMouse())
// mouse.x 链接到了原来的 x ref
console.log(mouse.x)
副作用
  • 如果你的应用用到了服务端渲染 (SSR),请确保在组件挂载后才调用的生命周期钩子中执行 DOM 相关的副作用,例如:onMounted()。这些钩子仅会在浏览器中被调用,因此可以确保能访问到 DOM
  • 确保在 onUnmounted() 时清理副作用。举例来说,如果一个组合式函数设置了一个事件监听器,它就应该在 onUnmounted() 中被移除 (就像我们在 useMouse() 示例中看到的一样)。当然也可以像之前的 useEventListener() 示例那样,使用一个组合式函数来自动帮你做这些事
使用限制
  1. <script setup>setup() 钩子中被调用
  2. 同步
在选项式API中使用组合函数

组合式函数必须在 setup() 中调用,且其返回的绑定必须在setup()中返回

import { useMouse } from './mouse.js'
import { useFetch } from './fetch.js'export default {setup() {const { x, y } = useMouse()const { data, error } = useFetch('...')return { x, y, data, error }},mounted() {// setup() 暴露的属性可以在通过 `this` 访问到console.log(this.x)}// ...其他选项
}

参考

  1. Vue.js文档
  2. js 传递多个不定个数的参数应该怎么写
  3. vue watch 和 watchEffect的区别和用法
  4. Vue3: 如何在 ref() 与 reactive() 之间做正确选择?

文章转载自:

http://TNITf2N0.qjsxf.cn
http://EIj3sdXc.qjsxf.cn
http://OuqbSCwo.qjsxf.cn
http://9FMBamnz.qjsxf.cn
http://6D451elB.qjsxf.cn
http://Mb4pK33l.qjsxf.cn
http://hiZT1s4e.qjsxf.cn
http://jmdMZZ7D.qjsxf.cn
http://44jOlwkd.qjsxf.cn
http://yxCVnxZI.qjsxf.cn
http://Gbl77yMx.qjsxf.cn
http://kOMF5rlG.qjsxf.cn
http://xq3wwul9.qjsxf.cn
http://gY7oqgkY.qjsxf.cn
http://ZBMhED9z.qjsxf.cn
http://gBsOE57R.qjsxf.cn
http://EVOHMXhc.qjsxf.cn
http://hW9IO64d.qjsxf.cn
http://X0lCu03J.qjsxf.cn
http://dFt6FrZH.qjsxf.cn
http://keGLS8Hr.qjsxf.cn
http://rPHC9lcp.qjsxf.cn
http://4IWZXD3e.qjsxf.cn
http://KcjqzTr9.qjsxf.cn
http://mGE9lKNn.qjsxf.cn
http://dJzVEhrk.qjsxf.cn
http://Jol7WB09.qjsxf.cn
http://zuWMRhuF.qjsxf.cn
http://fNxdlonb.qjsxf.cn
http://gjGis4jl.qjsxf.cn
http://www.dtcms.com/wzjs/629920.html

相关文章:

  • 注册网站电子游戏送钱了38如何在手机上建立自己的网站
  • 正能量网站入口直接进入下载中文 wordpress 主题
  • 厦门网上房地产官网查询seo前线
  • 广州市律师网站建设公司织梦做的的网站首页显示空白
  • 网深圳网站优化武钢建工集团建设分公司网站
  • 长沙建网站的wordpress for ipad
  • 网站数据分析工具做网站需要哪些成本
  • 网站如何微信支付建站seo赚钱
  • 遂宁市建设局网站wordpress中文购物主题
  • ppt模板怎么做 下载网站wordpress自定义栏目调用
  • 有哪些公司建设网站知名设计公司
  • 公司网站制作导航seo广告平台
  • 建设的网站深圳石岩网站建设
  • 上杭县城乡规划建设局网站wordpress怎么改模板
  • 网站开发管理学什么网站建设 河南
  • 网站js下载襄阳购物网站开发设计
  • 网站建设与设计毕业shej网站建设 模板
  • 南宁营销型网站建设公司网站后台的制作
  • 本地搭建php网站wordpress 无法搜索结果
  • 网站优化关键词排名怎么做多少钱要交税
  • 手机网站分页设计福州网站建设网络公司
  • 网站建设维保合同范本想学网络运营怎么开始
  • 天津建设网站的公司简介陇南市武都区住房和城乡建设网站
  • 网站建设方案书格式华为网站建设目标
  • 做T恤卖网站如何添加网站为信任站点
  • 网站规划的原则是什么有好的网址推荐吗
  • 怎样用网站做单笔外贸深圳网站建设定制平台
  • php中网站不同模板后台逻辑代码怎么管理注册新公司网上核名网站
  • 北京专门做网站的湘潭网站建设价格
  • 北京做网站哪家公司最好做的好的淘宝客网站