Taro react 160 行实现@别人功能

本文详细介绍了在Taro中利用React实现@别人功能的组件开发过程,包括需求分析、组件实现和实现细节。针对小程序文本域输入回调信息不足的问题,提出了一种算法来定位新输入字符的位置,并通过防抖技术减少搜索请求。此外,文章还讨论了如何在用户输入@后更新内容、重新获取焦点以及确保被@人名称完整存在的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求分析

这个功能最让人头疼的地方在于小程序文本域的输入回调提供的信息过少,没办法直接判断输入位置,在 Taro 文档中提到 TextArea 的 onInput 事件会返回文本内容 value、光标位置 cursor、按键类型 keyCode 三个值。但是在我的实际测试中,只拿到了 value

image.png

image.png

这是什么人间疾苦。

所以说,我们需要先搞一个算法来找到当前新输入了什么以及在哪输入的。

之后的问题就好办了,如果输入的是 @,就拉起动作面板,选择某个人后触发回调,在正文里插入这个人的名字,然后把对应的信息存到另一个 state 方便后续操作就可以了。

组件实现

这里先贴出来完整代码,有需要的可以直接拿去用,组件库是 taro-vant

MentionTextarea\index.tsx

import { useReady } from "@tarojs/taro";
import { FC, forwardRef, useImperativeHandle, useRef, Ref, useState } from "react";
import { View, Textarea } from "@tarojs/components";
import { ActionSheet, Search, Cell, Notify } from "@antmjs/vantui";
import { debounce, DebouncedFunc } from 'lodash';
import { getQuestionUser } from "@/services/engineerCarbonCopyProblem";

export interface Props {
  defaultContent?: string
  className?: string
  ref?: Ref<MentionTextareaRef>
}

/**
* 抄送问题人员
*/
export interface QuestionUser {
  id: number
  originId: number
  name: string
  tel: string
  /**
  * 岗位名
  */
  type: string
}

export interface MentionTextareaRef {
  /**
   * 获取填写的内容
   * @returns [正文内容,抄送人员列表]
   */
  getContent: () => [string, QuestionUser[]]
  /**
   * 设置填写的内容
   */
  setContent: (content: string) => void
}

/**
 * 找到新旧字符串的变化
 *
 * @param oldStr 老字符串
 * @param newStr 新字符串
 * @returns [变更的字符(删除则为空), 变更的位置]
 */
const findDiffChar = (oldStr: string, newStr: string): [string, number] => {
  const arr1 = oldStr.split("");
  const arr2 = newStr.split("");

  // 用较长的内容进行遍历
  const
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值