react如何使用useRef模仿抖音标题里面添加标签内容

 更新时间:2024年10月26日 10:51:23   作者:变向加后撤  
本文介绍了如何模仿抖音发布页面,使用div元素作为输入框,并利用CSS样式和JavaScript动态操作DOM,实现类似于input输入框的功能,感兴趣的朋友跟随小编一起看看吧

这是抖音的发布页面,此篇文章目的就是为了模仿input输入特定的文本为标签,并且显示不同的样式,

本组件使用一个 div 元素作为输入框,通过 CSS 样式和 JavaScript 动态操作 DOM,来实现与传统 input 输入框相似的功能。用户在输入框中输入以 # 开头的文本时,组件会将其解析为标签,并使用不同的样式进行显示。

import React, { useState, FC, useRef } from 'react';
interface InputTagProps {
  value: string;
  onChange: (value: string) => void;
}
const InputTag: FC<InputTagProps> = ({ value, onChange }) => {
  const myRef = useRef<HTMLDivElement>(null);
  const [isEditing, setIsEditing] = useState(false);
  interface ParsedText {
    type: string;
    content: string;
  }
  const parseText = (input: string): ParsedText[] => {
    // 使用新的正则表达式来分割文本,保留空格
    const parts = input.split(/((?<=\s)|(?=\s)|(?=#))/g).filter(Boolean);
    return parts.reduce<ParsedText[]>((acc, part) => {
      if (part.trim() === '') {
        // 保留空格
        acc.push({ type: 'space', content: part });
      } else if (part.startsWith('#')) {
        // 修改标签的正则表达式,允许单个#
        if (/^#[\w\u4e00-\u9fa5]*$/.test(part)) {
          acc.push({ type: 'tags', content: part });
        } else {
          // 如果不是有效的标签,作为普通文本处理
          acc.push({ type: 'text', content: part });
        }
      } else {
        acc.push({ type: 'text', content: part });
      }
      return acc;
    }, []);
  };
  const handleClick = () => {
    setIsEditing(true);
    if (myRef.current) {
      myRef.current.innerText = ''; // 清空输入框内容
    }
  };
  const handleBlur = () => {
    setIsEditing(false);
    if (myRef.current) {
      const innerText = myRef.current.innerText;
      onChange(innerText); // 更新外部值
      myRef.current.innerHTML = ''; // 清空现有内容
      // 根据解析的文本动态创建子元素
      parseText(innerText).forEach((item) => {
        const span = document.createElement('span');
        span.innerText = item.content;
        span.style.color = item.type === 'tags' ? 'green' : 'black'; 
        myRef.current.appendChild(span);
      });
    }
  };
  const handleInput = (event: React.FormEvent<HTMLDivElement>) => {
    console.log("chu")
    if (myRef.current) {
      const innerText = myRef.current.innerText;
      // 清空内容以便重新填充
      myRef.current.innerHTML = '';
      // 根据解析的文本动态创建子元素
      parseText(innerText).forEach((item) => {
        const span = document.createElement('span');
        span.innerText = item.content;
        span.style.color = item.type === 'tags' ? 'green' : 'black'; 
        myRef.current.appendChild(span);
      });
      // 保持光标在最后
      const range = document.createRange();
      const selection = window.getSelection();
      range.selectNodeContents(myRef.current);
      range.collapse(false); // 将光标放在最后
      selection?.removeAllRanges();
      selection?.addRange(range);
    }
  };
  return (
    <div
      ref={myRef}
      style={{
        border: '1px solid #ccc',
        borderRadius: '4px',
        padding: '8px',
        width: '100%',
        cursor: isEditing ? 'text' : 'pointer',
      }}
      onClick={handleClick}
      onInput={handleInput} 
      onBlur={handleBlur}
      contentEditable="true"
      data-placeholder="请输入内容"
      data-node="true"
    >
    </div>
  );
};
export default InputTag;

  • 动态解析输入文本:用户输入文本后,组件会实时解析输入的内容,并根据规则将特定格式的文本(如以 # 开头的标签)动态生成对应的 span 标签。
  • 自定义样式:标签的样式可根据其类型进行不同的设置,例如使用绿色显示标签,黑色显示普通文本。
  • 支持中文标签:通过修改正则表达式,组件支持中文字符作为标签的一部分,使其更加灵活和适应多语言环境。

在实现过程中,遇到了一些问题,例如无法实时处理输入、输入 # 时内容被清空等。通过不断调试和测试,最终成功解决了这些问题。这一过程提醒我们,在开发中,细致入微的测试是必不可少的。通过对代码的逐行检查和调试,我们能够发现潜在的错误和性能问题。

到此这篇关于react使用useRef模仿抖音标题里面添加标签内容的文章就介绍到这了,更多相关react使用useRef内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React中useRef hook的简单用法

    React中useRef hook的简单用法

    useRef是react的自定义hook,它用来引用一个不需要渲染的值,这篇文章介绍useRef的简单用法,感兴趣的朋友一起看看吧
    2024-01-01
  • react-native android状态栏的实现

    react-native android状态栏的实现

    这篇文章主要介绍了react-native android状态栏的实现,使状态栏颜色与App颜色一致,使用户界面更加整体。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • React中使用collections时key的重要性详解

    React中使用collections时key的重要性详解

    这篇文章主要给大家介绍了关于在React.js中使用collections时key的重要性,注意:一定不能不能忘了key,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面跟着小编来一起学习学习吧。
    2017-08-08
  • react mobx 基本用法示例小结

    react mobx 基本用法示例小结

    mobx是一个轻量级的状态管理器,所以很简单(单一全局数据使用class)类有get 数据方法,本文通过示例代码介绍react mobx 基本用法,感兴趣的朋友有一起看看
    2023-11-11
  • React中setState/useState的使用方法详细介绍

    React中setState/useState的使用方法详细介绍

    这篇文章主要介绍了React中setState/useState的使用方法,useState 和 setState 在React开发过程中 使用很频繁,但很多人都停留在简单的使用阶段,并没有正在了解它们的执行机制
    2023-04-04
  • React应用中避免白屏现象的方法小结

    React应用中避免白屏现象的方法小结

    在开发React应用程序时,我们都曾遇到过这样的场景:一个未被捕获的异常突然中断了组件的渲染流程,导致用户界面呈现出一片空白,也就是俗称的“白屏”现象,本文将探讨如何在React应用中有效捕获并处理这些错误,避免白屏现象的发生,需要的朋友可以参考下
    2024-06-06
  • React Markdown配置示例

    React Markdown配置示例

    React-Markdown 是一个基于 React 的 Markdown 渲染组件库,其核心设计理念是通过 Unified 生态系统实现安全、可扩展的 Markdown 解析
    2025-04-04
  • 一文详解React组件API

    一文详解React组件API

    这篇文章主要介绍了React的组件API,及组件API的用法详解,文中有详细的代码示例,对学习或工作有一定的参考价值,感兴趣的同学可以阅读本文
    2023-04-04
  • React组件中监听函数获取不到最新的state问题

    React组件中监听函数获取不到最新的state问题

    这篇文章主要介绍了React组件中监听函数获取不到最新的state问题问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • React-hooks中的useEffect使用步骤

    React-hooks中的useEffect使用步骤

    这篇文章主要介绍了React-hooks中的useEffect,对于React组件来说,主作用是根据数据(state/props)渲染UI,除此之外都是副作用(比如手动修改DOM、发送ajax请求),本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-05-05

最新评论