使用自定义hooks,封装公共全局弹框

Vue3 Hooks函数使用及封装思想 专业解释:Vue 3中的Hooks函数是一种用于在组件中共享可复用逻辑的方式。大白话:将单独功能的js代码抽离出来, 加工成公共函数,从而达到逻辑复用。对Vue社区调研,了解了许多使用Vue的开发者对于更好的组件逻辑组织方式的期望。对React Hooks和其他前端框架的解决方案进行了学习和借鉴。有了composition API 意味着我们就可以自定义封装hooks,最终的目的都是进行复用,在Vue2中复用的方式大部分都是采取的mixin,但相比hooks,hooks更清楚复用的功能来源及功能。 阅读详情

实现思路

通过useContext,provider实现全局的数据传递

  • app.js
import 'tslib'
import './index.css'
import App from './App'
import * as React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom'
import { Provider } from 'react-redux'
// import reportWebVitals from './reportWebVitals'
import * as serviceWorker from './serviceWorker'
import { ActionProvider } from './utils/ActionProvider'
// 可以通过向仓库派发动作的方式实现路由跳转。
// 每次路径发生变化时可以把最新的路径放到仓库里面,以便随时在仓库中获取。
import { store } from './store'
import { actions } from '@/store/actions'

ReactDOM.render(
  // <React.StrictMode></React.StrictMode>  启动react的严格模式检查
  <Provider store={store}>
    <BrowserRouter>
      <ActionProvider actions={actions}>
          <App />
      </ActionProvider>
    </BrowserRouter>
  </Provider>,
  document.getElementById('root')
)
// reportWebVitals(console.log) // 性能监控 https://www.jianshu.com/p/9d75592edb9e
serviceWorker.unregister()

  • ActionProvider 封装
import React, { useState, useCallback, useMemo, Suspense, ReactElement, ReactNode } from 'react'
import { useLocation } from 'react-router-dom'
import { uuid } from './index'  // 生成uuid
import ActionContext from './ActionContext' // context
import useDidUpdate from '@/hooks/useDidUpdate' // 类似于componentDidupdate
import ActionLoading from './ActionLoading'
import ActionVisible from './ActionVisiable'

const DEFAULT_OPTIONS = {
  removeDelay: 300,
  initialVisible: true,
  Loading: ActionLoading,
  loadingProps: undefined
}

const NOOP = { update: () => {}, close: () => {} }

const isDevEnv = process.env.NODE_ENV === 'production'

if (isDevEnv) Object.freeze(NOOP)

interface Props {
  actions: Object[],
  removeDelay?: number,
  initialVisible?: boolean,
  Loading?: any,
  loadingProps?: any,
  children?: ReactNode
}

export const ActionProvider = ({
  actions,
  removeDelay,
  initialVisible,
  Loading,
  loadingProps,
  children }: Props): ReactElement => {
  const {
    pathname
  } = useLocation()

  const providerOptions = useMemo(() => {
    const result = { ...DEFAULT_OPTIONS }
    if (initialVisible !== undefined) result.initialVisible = initialVisible
    if (removeDelay !== undefined) result.removeDelay = removeDelay
    if (Loading !== undefined) result.Loading = Loading
    if (loadingProps !== undefined) result.loadingProps = loadingProps
    return result
  }, [Loading, initialVisible, loadingProps, removeDelay])

  const [visibleActions, setVisibleActions] = useState<any[]>([])

  const close = useCallback((type?:string, id?:string) => {
    if (type === undefined && id === undefined) {
      setVisibleActions([])
    } else {
      if (type !== undefined && id !== undefined) {
        setVisibleActions(visibleActions =>
          visibleActions.filter(
            visibleAction =>
              !(visibleAction.type === type && visibleAction.id === id)
          )
        )
      } else if (type !== undefined) {
        setVisibleActions(visibleActions =>
          visibleActions.filter(visibleAction => visibleAction.type !== type)
        )
      } else if (id !== undefined) {
        setVisibleActions(visibleActions =>
          visibleActions.filter(visibleAction => visibleAction.id !== id)
        )
      }
    }
  }, [])
  const open = useCallback(
    (type, props, options) => {
      if (isDevEnv) {
        if (typeof type !== 'string' || type === '') {
          console.error('`type` muse be an non-empty string')
        }
        if (props !== undefined) {
          if (typeof props !== 'object' || props === null) {
            console.error('`props` must be an object')
          }
          if (props.action !== undefined) {
            console.error(
              "You can't provide a prop named `action` for a global action component"
            )
          }
        }
        if (options !== undefined) {
          if (typeof options !== 'object' || options === null) {
            console.error('`options` must be an object')
          }
          if (options.id !== undefined) {
            if (typeof options.id !== 'string' || options.id === '') {
              console.error('`options.id` must be an non-empty string')
            }
          }
          if (options.removeDelay !== undefined) {
            if (
              typeof options.removeDelay !== 'number' ||
              options.removeDelay < 0 ||
              isNaN(options.removeDelay)
            ) {
              console.error(
                '`options.removeDelay` must be an integer greater than or equal to zero'
              )
            }
          }
        }
      }
     
      const newVisibleAction = {
        type,
        props,
        id: options && options.id !== undefined ? options.id : uuid(),
        ref: options && options.ref,
        initialVisible:
          options && options.initialVisible !== undefined
            ? options.initialVisible
            : providerOptions.initialVisible,
        removeDelay:
          options && options.removeDelay !== undefined
            ? options.removeDelay
            : providerOptions.removeDelay,
        Loading:
          options && options.Loading !== undefined
            ? options.Loading
            : providerOptions.Loading,
        loadingProps:
          options && options.loadingProps !== undefined
            ? options.loadingProps
            : providerOptions.loadingProps
      }

      if (
        visibleActions.find(
          visibleAction =>
            visibleAction.type === newVisibleAction.type &&
            visibleAction.id === newVisibleAction.id
        )
      ) {
        if (isDevEnv) {
          console.error(
            `Can't open action of the same \`type\`(${newVisibleAction.type}) and \`id\`(${newVisibleAction.id})`
          )
        }
      } else {
        setVisibleActions(visibleActions => [
          ...visibleActions,
          newVisibleAction
        ])
        return {
          update: (newProps: any) => {
            setVisibleActions(visibleActions => {
              visibleActions = [...visibleActions]
              const action = visibleActions.find(item => {
                return (
                  item.type === newVisibleAction.type &&
                  item.id === newVisibleAction.id
                )
              })
              if (action) {
                if (typeof newProps === 'function') {
                  action.props = newProps({ ...action.props })
                } else if (typeof newProps === 'object' && newProps != null) {
                  action.props = { ...action.props, ...newProps }
                } else {
                  if (isDevEnv) {
                    console.error('`newProps` must be an object or a function')
                  }
                }
              }
              return visibleActions
            })
          },
          close: () => {
            close(newVisibleAction.type, newVisibleAction.id)
          }
        }
      }
    
      return NOOP
    },
    [
      close,
      providerOptions.Loading,
      providerOptions.initialVisible,
      providerOptions.loadingProps,
      providerOptions.removeDelay,
      visibleActions
    ]
  )


  const providerValue = useMemo(
    () => ({
      actions,
      visibleActions,
      open,
      close
    }),
    [actions, close, open, visibleActions]
  )

  const renderVisibleActions = useMemo(() => {
    return providerValue.visibleActions
      .map(visibleAction => {
        const action = actions.find(
          (_action: any) => {
            return _action.type === visibleAction.type
          }
        )

        if (action) {
          return (
            <Suspense
              key={visibleAction.id}
              fallback={
                <ActionVisible
                  id={visibleAction.id}
                  type={visibleAction.type}
                  initialVisible={false}
                  removeDelay={visibleAction.removeDelay}
                  Component={visibleAction.Loading}
                  componentProps={visibleAction.loadingProps}
                  closeAction={close}
                />
              }
            >
              <ActionVisible
                id={visibleAction.id}
                type={visibleAction.type}
                initialVisible={visibleAction.initialVisible}
                removeDelay={visibleAction.removeDelay}
                Component={action.component}
                componentProps={visibleAction.props}
                closeAction={close}
                forwardRef={visibleAction.ref}
              />
            </Suspense>
          )
        } else {
          if (isDevEnv) {
            console.error(`Can't find the \`${visibleAction.type}\` action.`)
          }
        }
        return null
      })
      .filter(Boolean)
  }, [actions, close, providerValue.visibleActions])

  useDidUpdate(() => {
    close()
  }, [pathname] as any)

  return (
    <ActionContext.Provider value={providerValue as any}>
      {children}
      {renderVisibleActions}
    </ActionContext.Provider>
  )
}

  • action库
import { lazy } from 'react'
export const actions = [
  {
    type: 'TestModal',
    component: lazy(() => import('@/components/Modals/index'))
  }
]

  • ActionVisiable
import React, { memo, useState, useCallback, useMemo, ReactElement } from 'react'
import useTimeout from '@/hooks/useTimeout'

interface Props {
  id: string,
  type: string,
  Component: any,
  initialVisible: boolean,
  componentProps: any,
  closeAction: any,
  removeDelay: number,
  forwardRef?: any
}

function ActionVisiable ({
  id,
  type,
  Component,
  initialVisible,
  componentProps,
  closeAction,
  removeDelay,
  forwardRef
}: Props): ReactElement {
  const [visible, setVisible] = useState(!!initialVisible)
  const closeActionDelay = useCallback(() => {
    closeAction(type, id)
  }, [closeAction, id, type])
  const [setCloseActionTimeout] = useTimeout(closeActionDelay, removeDelay)
  const open = useCallback(() => {
    setVisible(true)
  }, [])
  const close = useCallback(() => {
    setVisible(false)
    setCloseActionTimeout()
  }, [setCloseActionTimeout])
  const injectedActionProps = useMemo(() => {
    return { visible, open, close, id, type }
  }, [close, id, open, type, visible])

  const content = (
    <Component
      {...componentProps}
      ref={forwardRef}
      action={injectedActionProps}
    />
  )
  return content
}

export default memo(ActionVisiable)

  • ActionLoading

import React, { memo, useMemo, ReactNode, FC, ReactElement } from 'react'
import { Drawer, Modal, Spin } from 'antd'
import useTimeout from '@/hooks/useTimeout'
import useDidMount from '@/hooks/useDidMount'

enum myType {
  'modal',
  'drawer'
}

interface Props {
  action: {
    visible: boolean,
    open: () => {},
    close: () => {},
  },
  type: myType,
  delay: number,
  children: ReactNode,
};

const myChildren: FC<any> = () => {
  const content = (
  <div style={{ textAlign: 'center', padding: '24px 0' }}>
    <Spin />
  </div>)
  return content
}

function ActionLoading ({ type = myType.modal, delay = 300, children = myChildren, action, ...rest }: Props): ReactElement {
  const { visible, open, close } = action
 
  const [startOpenTimer] = useTimeout(open, delay)
  useDidMount(startOpenTimer)

  const overlayProps = useMemo(() => {
    switch (type) {
      case myType.drawer:
        return {
          visible,
          onClose: close,
          destroyOnClose: true,
          ...rest
        }
      case myType.modal:
      default:
        return {
          visible,
          onCancel: close,
          footer: null,
          destroyOnClose: true,
          maskClosable: false,
          ...rest
        }
    }
  }, [close, rest, type, visible])

  return type === myType.drawer ? <Drawer {...overlayProps}>{children}</Drawer> : <Modal {...overlayProps}>{children}</Modal>
}

export default memo(ActionLoading)

  • useDidUpdate
import { useEffect, useRef } from 'react'
export default function useDidUpdate (fn: Function, deps = []) {
  const mountedRef = useRef(false)
  useEffect(
    () => {
      if (mountedRef.current) {
        fn()
      }
      if (!mountedRef.current) {
        mountedRef.current = true
      }
    },
    // eslint-disable-next-line react-hooks/exhaustive-deps
    deps
  )
}
  • useAction
import { useContext, useCallback } from 'react'
import ActionContext from '@/utils/ActionContext'
export default function useAction (defaultType: any, defaultOptions?: any) {
  const { open: openAction } = useContext(ActionContext)
  const open = useCallback(
    (type?: any, props?: any, options?: any) => {
      if (defaultType) {
        options = props
        props = type
        type = defaultType
      }
      if (defaultOptions) {
        options = { ...defaultOptions, ...options }
      }
      return openAction(type, props, options)
    },
    [defaultOptions, defaultType, openAction]
  )
  return open
}

使用方法

import React, { ReactElement } from 'react'

export default function MyModal (): ReactElement {

  const openModal = useAction('TestModal')
  
 const handleClick = React.useCallback(() => {
    openModal()
  }, [openModal])
  
  return (
    <div>
      <button onClick={handleClick}>打开modal</button>
    </div>
  )
}

  • TestModal
import React, { forwardRef, useCallback, ReactNode } from 'react'
import { Modal } from 'antd'

interface Props {
  action: any,
  onOk: any,
  children?: ReactNode,
  title: string
}

const ActionModal = ({ action, onOk, title, children, ...rest }: Props, ref?: any) => {
  const { visible, close } = action

  const handleOk = useCallback((e) => {
    if (onOk) {
      onOk(e)
    }
    close()
  }, [close, onOk])
  return (
    <Modal
      {...rest}
      ref={ref}
      title={title}
      visible={visible}
      onCancel={close}
      onOk={handleOk}
    >
      {children}
    </Modal>
  )
}

export default forwardRef(ActionModal)

总结

是不是很方便呢

vue3中hooks用法详解 hook是钩子的意思,看到“钩子”是不是就想到了钩子函数?事实上,hooks还真是函数的一种写法。vue3借鉴开发出了,所以也就意味着也能进行自定义封装hooks。vue3中的hooks就是函数的一种写法,就是将文件的一些单独功能的js代码进行抽离出来,放到单独的js文件中,或者说是一些可以复用的公共方法/功能。其实hooks和vue2中的mixin有点类似,但是相对mixins而言,hooks更清楚复用功能代码的来源, 更清晰易懂。 阅读详情

相关推荐

uniapp中renderjs实战:手把手教你实现SSE即时通讯(附完整代码)

本文通过一个完整的实战案例,详细讲解了如何在uni-app中使用RenderJS实现SSE即时通讯功能。文章剖析了RenderJS作为Vue视图层强力补充的原理,并提供了包含自动重连、状态管理等健壮性设计的完整代码,帮助开发者突破框架限制,高效集成浏览器原生API。

weixin_29005499的博客 188

React Hooks 学习 - 04 自定义Hook、路由钩子函数

自定义 Hook 函数 自定义 Hook 是标准的封装和共享逻辑的方式,其实就是逻辑和内置 Hook 的组合,用于将组件逻辑提取到可重用的函数中。 自定义 Hook 是一个函数,其名称以 use 开头,函数内部可以调用其它的 Hook。 使用自定义 Hook 提取可复用的逻辑,相比 render props 和 高阶函数简单很多。 示例1 初始示例 import { useState, useEffect, useRef} from 'react' function App() { const [co

皮蛋很白的博客 929

066、AR 应用中虚拟物体漂移抖动?IMU 融合 + 光流追踪的视觉里程计优化方案

AR应用中虚拟物体漂移抖动优化方案 摘要:针对AR应用中虚拟物体漂移抖动问题,提出一种IMU融合与光流追踪的视觉里程计优化方案。关键点包括:1) 采用IMU预积分技术处理高频噪声,通过中值积分计算帧间相对运动约束;2) 使用金字塔LK光流追踪像素运动,通过中值偏差法剔除异常值;3) 构建10帧滑动窗口的紧耦合优化框架,将IMU预积分约束和光流重投影约束联合优化。实验表明,该方法有效解决了时间戳未对齐导致的"跳舞箭头"现象,在手机端实现稳定30fps的AR定位精度,漂移误差降低至厘米级。特别提醒:IMU与视觉

ai技术增长的博客 161

React 项目中常用自定义hooks

react 项目中常用的自定义hook

qq_27314517的博客 777

告别传统RAG的痛点!Agent Skills让知识库检索更智能(本地知识库搭建新思路:用Agent Skills实现渐进式检索)

传统RAG在知识库检索中存在文档结构丢失、Token消耗大等问题 📚 Agent Skills通过分层索引、渐进式检索等设计,实现了更智能的本地知识库检索方案 🤖 本文详细介绍了Agent Skills的核心设计理念、与传统RAG的对比以及实践建议,帮助你搭建高效的知识库系统 ✅

XiaoqiangClub的博客 692

YOLOv8改进系列:RepVGG重参数化结构——训练多分支,推理单路,极致提速

本文将详细介绍如何将RepVGG的重参数化思想融入到YOLOv8的骨干网络中,实现一种训练时多分支、推理时单路的改进版YOLOv8。我们将提供完整的代码实现、详细的原理讲解,并在COCO数据集和自定义数据集上进行充分的实验验证。

YOLO 200

自定义React-Hooks

一、React Hooks 1、Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 二、Hooks 优点 1、可以抽离公共方法和逻辑,提高代码的可复用性 2、函数式组件更简洁,开发效率更高 三、自定义 Hook 1、通过自定义 Hook,可以将组件逻辑提取到可重用的函数中 2、自定义 Hook 是一个函数,其名称以use开头,函数内部可以调用其他的Hook 3、初始化项目 create-reac...

麦子 1655

SCADA|KingSCADA通过组合框选择修改变量的值

《SCADA项目中组合框控件的使用方法》 本文详细介绍了SCADA系统中组合框(下拉框)控件的应用方法。通过具体示例演示如何实现:当选择"雷工笔记"时变量值为100,选择"雷工杂谈"时为200,选择"小李食代"时为300的功能。主要实现步骤包括:1)创建项目并添加组合框控件;2)设置Items选项及对应数值;3)创建内存变量;4)使用GetCurrentIndex()和GetItemData()方法;5)在选项变化事件中编写脚本。该控件在SCADA

做有价值的事,积累有价值的笔记! 864

2-2-9 & 10 & 11 React Hooks 封装公共行为

- 渲染函数的输入是属性 - 输出是JSX - 行为是Hooks 那么对于多个组件公共行为(副作用)应该如何封装呢? 公共Scroll事件的封装 可以通过Hooks封装公共的行为,例如滑动、触摸等复杂的事件处理,可以用hooks封装,从而简化使用。 import { UIEventHandler, useEffect, useRef } from "react" class ScrollDescriptor { private left: number = 0 private t

m0_38066007的博客 697

微信小程序 - 实现大文件上传分片/切片+本地选择文件上传超大文件,小程序大文件切片上传+断点续传+上传进度条+失败自动重传完整运行示例源码,支持图片、视频、文档各种文件(支持上传单个文件或批量上传)

微信小程序实现大文件上传,实现分片大文件上传,微信小程序 分片 断点续传 大文件上传,微信小程序实现大文件上传 分片上传 进度条,小程序文件分片上传,微信小程序如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,微信小程序实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,微信小程序wx.uploadFile,小程序上传视频,小程序上传文档,实现大文件上传(切片上传)实现大文件上传到服务器教程,支持批量多

🏆 前端领域优质创作者 1万+

3060台式机 Ubuntu 双系统部署 LingBot-Map 完整指南

摘要: 本文详细介绍了在配备RTX 3060显卡的台式机上部署Ubuntu双系统并安装LingBot-Map 3D重建模型的完整流程。LingBot-Map作为蚂蚁灵波科技开源的Transformer架构模型,在流式3D场景重建中展现出高效性能(20 FPS)和卓越精度(ATE仅6.42米)。指南涵盖关键准备步骤、UEFI分区原理、Ubuntu安装流程(推荐150GB空间及手动分区方案),以及后续驱动配置说明,特别强调RTX 3060需12GB显存支持,并提供了数据备份、Secure Boot处理等实用建议

huanghm88的专栏 309

react 全局消息弹窗

component import React, { forwardRef, useImperativeHandle, useCallback } from "react"; import { Button, Snackbar as MaterialSnackbar, IconButton, } from "@material-ui/core"; import CloseIcon from "@material-ui/icons/Close"; export const snackbar: Re

宏斌的博客 1566

uniapp [全端兼容] - 详细实现全局修改设置字体大小功能效果,统一修改页面字号字体大小,一键改变字号整个项目立即生效,大中小字号预设、老年人大字模式场景,uniApp全平台兼容控制页面字号大小

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,修改字体大小,一键调整UniApp字体大小,实时改变不用刷新,动态设置字体大小,uniapp全局修改字体字号大小,如何控制全局字号,可调整显示的字体,全项目生效,老年人大字模式,改变所有页面的字体,全局设置字体大小,实现小中大的字体切换,设置改变全局字体大小功能,如何做到全平台兼容,H5APP实现全局字体大小调整,不兼容报错,用户设置字号,全局设置应用字体大小,大中小字体修改,页面设置page-me

🏆 前端领域优质创作者 1万+

Vue3 自定义Hooks函数的封装

在Vue 3中,自定义hooks允许开发者封装和重用逻辑代码。自定义hooks是使用Composition API时创建的函数,这些函数可以包含任意的组合逻辑,并且可以在多个组件之间共享。自定义hooks通常遵循这样的命名约定:以use开头,后面跟上hook的名称,这样做可以清晰地表明它是一个自定义的hooks。01、具备可复用功能,才需要抽离为 hooks 独立文件02、函数名/文件名以 use 开头,形如: useXX03、引用时将响应式变量或者方法显式解构暴露出来;

weixin_48420104的博客 2043

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

vue3 自定义hooks / 可组合函数

vue2.x下封装的mixins在引入文件都是通过this上下文来调用封装的属性或方法,而在vue3.0的composition API下不再使用this上下文,所以,实际上这两者就是冲突的,只能重新封装一套全新的方式来使用类似mixins的功能。 一、vue2.x里mixins的痛点 传统的mixins有很多让人诟病的地方,mixins 的深度合并非常隐式,这让使代码逻辑更难理解和调试,具体表现为如下几点: mixin 很容易发生冲突:因为每个特性的属性都被合并到同一个组件中,所以为了避免 proper

醉逍遥neo的博客 6448

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

使用react-hooks实现异步获取数据的封装

react-hooks作为react新的api,深受广大开发者的欢迎,不仅简化了代码,嵌套,还更符合react函数式编程的思想。react-hooks并不复杂,但是初期可能很多多学并不理解,不能从class写法转变过来。其实class的多个生命周期是可以通过hooks模拟实现的,且在服务端渲染时,hooks也有相对的优点,比如class在服务端渲染时存在的生命周期多次触发。本文就之前项目中相对复杂...

前端361 4570

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Vue3 Hooks函数使用及封装

将单独功能的js代码抽离出来, 加工成公共函数,从而达到逻辑复用。有了composition API 意味着我们就可以自定义封装hooks,最终的目的都是进行复用,在Vue2中复用的方式大部分都是采取的mixin,但相比hooks,hooks更清楚复用的功能来源及功能。

weixin_60196946的博客 959

vue3封装Hooks实现更好的逻辑复用

在构建前端应用中,经常会需要复用公共任务的逻辑。例如在一个管理后台中会存在很多的表格,其中的增删查改的内容就是可复用的部分,我们在写页面的过程中如果不封装的话会发现我们经常复制/粘贴。在Vue3的Composition API中引入了Hooks的概念,为我们提供了更灵活和可组合的代码组织方式。其中的一个重要概念就是Hooks。Hooks是一种函数,以use开头,用于封装一些可复用的逻辑。

qq_62401119的博客 2248

vue3的自定义hooks

Vue3 的 hook函数的出现,可以让我们更好抽离重复逻辑,聚合相同的功能。它与vue2 中的mixins有点类似,但是相对 mixins 而言, hooks 函数 更清楚复用功能代码的来源,更清晰易懂。使用 Vue3 的组合 API 封装的可复用,高内聚低耦合。1、具备可复用功能,才需要抽离为 hooks 独立文件2、函数名/文件名以 use 开头,形如: useXX3、引用时将响应式变量或者方法显式解构暴露出来;vue3 hooks 现在使用比较广泛,介绍基本概念与原理。

Bruce__taotao的博客 2656

Vue3.x 中 hooks 函数封装和使用

Vue3 自定义 Hooks 是组件下的函数作用域的,而 Vue2 时代的 Mixins 是组件下的全局作用域。Vue2 时代 Option Api ,data、methos、watch.....分开写,这种是碎片化的分散的,代码一多就容易高耦合,维护时来回切换代码是繁琐的!utils 是通用的工具函数,而 hooks 是对 utils 的一种封装,用于在组件中共享状态逻辑和副作用。它的主要作用是 Vue3 借鉴了 React 的一种机制,用于在函数组件中共享状态逻辑和副作用,从而实现代码的可复用性。

muzidigbig的博客 2975

最前端|一文详解Vue3.x 中 hooks 函数封装和使用

轻松封装复用功能,提升开发效率

在数字化道路无限探索 4362

vue3 自定义hooks 大集合 你要的自定义hooks 都在这,快来看吧!

每个人封装的 表格 hook 其实都有区别 所以大家可以综合一下 总结出比较适合自己项目的,因为每个人项目中的 ui 分页等等 都不太一样 所以个人建议总结出一个 集成到自己项目中是最好的。这个是我最推荐大家的hooks 平时没事的时候在里面逛一下 看看源码 绝对能学到很多,我平时用的比较多的是其中的。喜欢用 antd 的同学可以看看其中的。

qq_24428851的博客 472

vue3.0之自定义 hooks

目录vue3.0之自定义 hooksvueuse 封装了很多公共的 hook函数自定义hook 之 img转化为 base64hook / tobase64.ts使用 vue3.0之自定义 hooks 什么是 hooks 本质而言,hook就是一个函数,只不过hook是把 setup组合函数之中的 组件api(ref、reactive、conputed、watch、生命周期函数)等进行了封装抽离代码(公共代码,公共组件等),这样使得代码更加简洁 hook 类似于 vue2之中的 mixin vue

weixin_43845137的博客 2147

VUE3 之 HOOKS公共方法封装(TS)

【代码】VUE3 之 HOOKS公共方法封装(TS)

HanXiaoXi_yeal的博客 761

vue3自定义Hooks实现

官方对自定义 hook 定义:在 Vue 应用的概念中,“组合式函数” (Composables) 是一个利用 Vue 组合式 API 来封装和复用有状态逻辑的函数。其实 Hooks 本质是一个函数,把 setup 函数中使用的 Composition API 进行了封装。自定义 Hooks 可以复用代码, 让 setup 中的逻辑更清楚易懂。自定义Hooks是为了处理组件逻辑的一种模式。它可以让我们在不使用组件之间复制粘贴代码的情况下重用状态逻辑。自定义hooks是简单的javaScrpt函数,

前端工程师 · Vue 生态深耕者,专注多端与工程化 1254

vue3 中 自定义hooks

Hooks技术最早是由React团队的Sophie Alpert和Abramov在2018年提出来的,最初是为了解决React类组件中状态逻辑复用的问题而提出来的。在React使用类组件时,为了复用状态逻辑,需要使用高阶组件或者Render Props等方式,这些方式会增加代码的复杂度和维护成本。而Hooks技术是使用特定函数来“钩到”React的state和生命周期等特性的技术。它可以让我们在函数组件中使用state以及其他的React特性,代替传统的类组件或高阶组件等方式。

WZH15075051915的博客 1584
上一篇: 可视化简介
下一篇: WebGL可视化基础(一)
MaxLoongLvs
博客等级 码龄9年 226粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值