企业管理系统定制开发useImperativeHandle使用实例

useImperativeHandle企业管理系统定制开发可以让你在使用ref企业管理系统定制开发时自定义暴露给父组件的实例值。企业管理系统定制开发在大多数情况下,应当避免使用ref这样的命令式代码。useImperativeHandle应当与forwardRef一起使用。

useImperativeHandle介绍

useImperativeHandle(ref, createHandle, [deps])
  • 通过useImperativeHandle可以只暴露特定的操作

    • 通过useImperativeHandle的Hook, 将父组件传入的ref和useImperativeHandle第二个参数返回的对象绑定到了一起

    • 所以在父组件中, 调用inputRef.current时, 实际上是返回的对象

  • useImperativeHandle使用简单总结:

    • 作用: 减少暴露给父组件获取的DOM元素属性, 只暴露给父组件需要用到的DOM方法

    • 参数1: 父组件传递的ref属性

    • 参数2: 返回一个对象, 以供给父组件中通过ref.current调用该对象中的方法

实例:

父组件:

  1. import React, { useState, useEffect, useRef } from 'react';
  2. const cRef = useRef() as React.MutableRefObject<any>;
  3. //使用子组件暴露出来的方法 cRef.current
  4. const handleAgree = async () => {
  5. const res = await cRef.current.onFinish();
  6. }
  7. <Modal
  8. title="云端情报库"
  9. visible={isShow}
  10. onOk={handleAgree}
  11. onCancel={handleOff}
  12. destroyOnClose={true}
  13. >
  14. //CloudIntelligence 子组件
  15. <CloudIntelligence
  16. cRef={cRef}
  17. data={dataform}
  18. />
  19. </Modal>

子组件:

  1. import React, { useState, useImperativeHandle, useEffect } from 'react';
  2. //子组件解析出来
  3. const { cRef, data } = props;
  4. // 将方法暴露给父组件使用
  5. useImperativeHandle(cRef, () => ({
  6. form,
  7. onFinish,
  8. }));

回顾一下ref和forwardRef结合使用:

  • 通过forwardRef可以将ref转发给子组件
  • 子组件拿到父组件创建的ref, 绑定到自己的某一个元素中
  1. import React, { useRef, forwardRef } from 'react'
  2. // forwardRef可以将ref转发给子组件
  3. const JMInput = forwardRef((props, ref) => {
  4. return <input type="text" ref={ref} />
  5. })
  6. export default function ForwardDemo() {
  7. // forward用于获取函数式组件DOM元素
  8. const inputRef = useRef()
  9. const getFocus = () => {
  10. inputRef.current.focus()
  11. }
  12. return (
  13. <div>
  14. <button onClick={getFocus}>聚焦</button>
  15. <JMInput ref={inputRef} />
  16. </div>
  17. )
  18. }

forwardRef的做法本身没有什么问题, 但是我们是将子组件的DOM直接暴露给了父组件:

  • 直接暴露给父组件带来的问题是某些情况的不可控
  • 父组件可以拿到DOM后进行任意的操作
  • 我们只是希望父组件可以操作的focus,其他并不希望它随意操作其他方法

react hooks子组件向父组件传参(useContext)

  1. import React, { useState, useContext  } from 'react';
  2. import { ChildrenContext } from '../index';
  3. import { Button } from 'antd';
  4. export const Children= (props) => {
  5.     const { setParent } = props;
  6.     const baseval = useContext(ChildrenContext);
  7.     const onClick= () => {
  8.         setParent(false);
  9.     }
  10.     return (
  11.         <Button type="primary" onClick={()=>onClick()}>点击</Button>
  12.     );
  13. }


父组件

  1. import React, { useState, createContext } from 'react';
  2. import {Children} from './Children.js';
  3. export const ChildrenContext = createContext();
  4. export const Parent = () => {
  5.     const [parent, setChildren] = useState(false);
  6.     return (
  7.          <ChildrenContext.Provider value={parent}>
  8.             <Children setParent={setChildren}/>
  9.          </ChildrenContext.Provider>
  10.     );
  11. }


 
 

参考来源:

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发