当前位置: 首页 > 知识库问答 >
问题:

react.js - react18如何获取传入组件的节点信息并进行修改,类似vue的自定义指令El?

龙佐
2023-04-27

之前一直是vue的开发者,最近学习react直接从18开始学起,最早的class类组件有了解但是没有实际采用,想着直接学最新的。
现在有个问题,class类在写hoc的时候,是可以通过反向继承获取传入组件的节点以及各种数据,从而做到拦截或修改。但是我观察hook写法是没有办法实现super这个东西,那么我该如何实现模拟vue的自定义指令呢。
贴出一个我需要实现的例子:

app.directive('initval', {
    mounted: (el, binding) => {
      const val = +(binding.value)?.toFixed(binding.modifiers.noFix ? 4: 2)
      let plus = ''
      let color = ''
      if (isNaN(val) || +val === 0) {
        el.innerText = '0.00%'
      } else {
        if (+val > 0) {
          plus = '+'
          color = 'red'
        } else if (+val < 0) {
          color = 'green'
        }
        // 是否需要改颜色
        if (!binding.modifiers.noColor && color) {
          el.style.color = EColor[color as keyof typeof EColor]
        }
        // 纯改颜色
        if (binding.modifiers.pureColor) {
          return
        }
        // 是否需要箭头
        let preHtml = ''
        if (binding.modifiers.arrow) {
          preHtml = color === 'red'
            ? '<i class="up"></i>'
            : color === 'green'
              ? '<i class="down"></i>'
              : ''
        }
        el.innerHTML = `${preHtml}${binding.modifiers.noColor ? '' : plus}${val}%`
      }
    }
  })

逻辑是次要,主要我怎么获取到这个innerText并返回一个新的html出去呢?

共有1个答案

曾洲
2023-04-27
import React, { useRef, useEffect } from 'react';

const CustomDirectiveExample = ({ value, noColor, noFix, arrow, pureColor }) => {
  const el = useRef(null);

  useEffect(() => {
    const val = +(value)?.toFixed(noFix ? 4 : 2);
    let plus = '';
    let color = '';

    if (isNaN(val) || +val === 0) {
      el.current.innerText = '0.00%';
    } else {
      if (+val > 0) {
        plus = '+';
        color = 'red';
      } else if (+val < 0) {
        color = 'green';
      }

      if (!noColor && color) {
        el.current.style.color = color;
      }

      if (!pureColor) {
        let preHtml = '';

        if (arrow) {
          preHtml =
            color === 'red'
              ? '<i class="up"></i>'
              : color === 'green'
              ? '<i class="down"></i>'
              : '';
        }

        el.current.innerHTML = `${preHtml}${noColor ? '' : plus}${val}%`;
      }
    }
  }, [value, noColor, noFix, arrow, pureColor]);

  return <div ref={el}></div>;
};

export default CustomDirectiveExample;
 类似资料:
  • 微信小程序中原生提供了selectComponent/SelectorQuery.select方法获取自定义组件实例和wxml节点信息,但是该api使用起来不太方便,并且不具备平台无关性,我们提供了增强指令wx:ref用于获取组件实例及节点信息,该指令的使用方式同vue中的ref类似,在模板中声明了wx:ref后,在组件ready后用户可以通过this.$refs获取对应的组件实例或节点查询对象(

  • 本文向大家介绍vue 自定义指令自动获取文本框焦点的方法,包括了vue 自定义指令自动获取文本框焦点的方法的使用技巧和注意事项,需要的朋友参考一下 HTML: js: 官方例子: 我的: 在我的项目中使用官方的例子时,input不能自动获取焦点,使用我的js时可自动获取焦点,查询相关资料后知道,insert是一个钩子函数,只要父节点存在,在插入父节点时调用,我这里并没有插入所以没有调用,所以还是要

  • 我在UserProfile中添加自定义字段UserType作为字符串。我想更改我的获取值,并将该值传递到TempData中。 这是我在AccountController上的代码: 我对该方法进行了调试,以下是我掌握的信息: 有人对此有什么解决办法吗?我是ASP. NET的新手,但也许如果我实现自定义成员资格,它会工作,你觉得呢?你能给我一些例子吗?谢谢你们。 解决方案如下: `[HttpPost]

  • 简介 除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样: Vue.directive('focus', { inserted: function (el)

  • 1. 前言 本小节我们介绍 Vue 中的自定义指令。包括全局指令的注册、局部指令的注册、指令钩子函数的使用以及动态指令传参。其中,指令钩子函数和动态指令参数是本节的难点。 同学们需要充分理解每个指令钩子函数执行的时机、对动态指令参数多加练习才能对指令的使用得心应手。 2. 慕课解释 Vue 除了提供了默认内置的指令外,还允许开发人员根据实际情况自定义指令,它的作用价值在于当开发人员在某些场景下需要

  • 问题内容: 我正在编写一个在x86-32和x86-64 Linux中使用和进行反汇编的工具。问题是,尽管我能够分解libopcode,但无法获得任何指令信息。为了演示起见,我举了一个最小的例子来重现我的问题。该程序应从入口点反汇编到第一个/ 。 该代码有点被全局变量所破坏,为简洁起见,省略了错误检查等,但是应该清楚地说明问题。 可以使用以下内容构建此源。要执行成功的链接,需要将该软件包安装在本地计