Taro react 160 行实现@别人功能

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

需求分析

这个功能最让人头疼的地方在于小程序文本域的输入回调提供的信息过少,没办法直接判断输入位置,在 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
要在Taro中使用React开发小程序实现地图功能,你需要使用第三方库来实现地图功能,比如腾讯地图SDK或高德地图SDK。 以下是一个使用腾讯地图SDK的示例,假设你已经安装了Tarotaro-ui: 1. 安装taro-plugin-ttml,它可以让你在Taro中使用TTML(Tencent Template Markup Language)来渲染腾讯地图组件。 ``` npm install taro-plugin-ttml --save-dev ``` 2. 在`config/index.js`中配置ttml插件: ```javascript module.exports = { plugins: ['ttml'] } ``` 3. 在需要使用地图的页面中引入地图组件并使用TTML渲染地图: ```jsx import Taro from '@tarojs/taro' import { View } from '@tarojs/components' import { Map } from 'taro-plugin-ttml' function MapPage() { return ( <View> <Map id="myMap" style={{ width: '100%', height: '500px' }} /> </View> ) } export default MapPage ``` 4. 在`app.js`中初始化腾讯地图SDK: ```javascript import Taro from '@tarojs/taro' import QQMapWX from './utils/qqmap-wx-jssdk' Taro.initAMapApiLoader({ key: 'your_amap_key', version: '1.4.15', plugins: ['AMap.Scale', 'AMap.OverView', 'AMap.ToolBar', 'AMap.MapType'], AMapUI: { version: '1.1', plugins: ['overlay/SimpleInfoWindow', 'misc/PoiPicker'] }, Loca: { version: '1.3.2' } }) // 初始化腾讯地图SDK Taro.getLocation({ type: 'gcj02', success: function (res) { const { latitude, longitude } = res new QQMapWX({ key: 'your_qqmap_key' }).reverseGeocoder({ location: { latitude, longitude }, success: function (res) { console.log(res) } }) } }) ``` 其中,`your_amap_key`是你的高德地图开发者密钥,`your_qqmap_key`是你的腾讯地图开发者密钥。 这样就可以在Taro中使用React开发小程序实现地图功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值