首页 > 其他分享 >怎么做一个缓缓变大,还能缓缓变小的提示栏--P2 自动聚焦

怎么做一个缓缓变大,还能缓缓变小的提示栏--P2 自动聚焦

时间:2023-02-04 23:55:49浏览次数:33  
标签:P2 .. 缓缓 focus React -- state input useEffect

上一篇就是简单介绍了我是如何编写一个带有渐入渐出动画效果的input框的实现细节。
我当时觉得很高兴,因为我对这种(对我的技术力来说已经是比较)酷炫的动画一直没有特别好的理解和使用,兴奋之余,发现网上也没找到类似的东西,就给贴上网了。

然后就继续完善Input的,过程中又发现一个问题。

我的Input不能自动聚焦。

下面贴图示意。
能自动聚焦

不能自动聚焦,弱鸡

上面两张图片说明了我的需求,这个Input框出现了,说明用户要输入东西了,那么为了交互体验,势必要自动聚焦,在react中,这个需要一个小技巧。
有三个小点
1.在input元素上添加 autoFocus,不好用。
这个貌似是react给input加上focus效果的时间比react把input渲染到DOM里的时间早,所以失效。
2.使用useEffect/useLayoutEffect,不一定好用
这个我试了,实际上他是生效的.但是input从invisible到visible 有一个re-render,这个re-render把之前的focus效果给“顶掉了”
3.在 useEffect/useLayoutEffect里加上一个 setTimeout,就有效了。
实际上就是做一个延迟更大的 useEffect 。

程序文本如下

import React, { ReactElement } from "react";
import cs from "classnames";

import ButtonCustomized from "../../../../lib/Button/ButtonCustomized/ButtonCutomized";
interface Props {}

export default function RollingInput({}: Props): ReactElement {
  // 开合状态的state
  const [state, setstate] = React.useState(false);
  //input value的状态
  const [val, setval] = React.useState("");
  let inputRef = React.useRef(null);
  // 注意, 即使是useLayoutEffect ,自动focus也失效.
  //用setTimeout做个更慢的延迟。。
  React.useEffect(() => {
    setTimeout(() => {
      (inputRef.current as any).focus();
    }, 100);
    (inputRef.current as any).focus();
    return () => {
      // can this clear operation work? will it cause any trouble?
      inputRef = null as unknown as React.MutableRefObject<null>;
    };
  }, [state]);
  return (
    <div className="tw-relative">
      <div
        className={cs("tw-absolute  tw-w-4/5 tw-transition-all ", {
          "tw-pt-0": state === false,
          "tw-pt-4": state,
          "tw-h-0": state === false,
          "tw-duration-300": state,
        })}
      >
        <div
          className={cs("-tw-mt-4 tw-flex tw-duration-100", {
            // "tw-invisible": !state,
          })}
        >
          <input
            className="tw-caret-purple-800
            tw-rounded-l-md
            tw-outline-none
            tw-leading-[3.5rem]
            tw-text-4xl
            tw-pl-3
            tw-align-middle
            tw-h-14
            tw-text-black tw-w-4/5 
            
            tw-z-30"
            type="text"
            value={val}
            ref={inputRef}
            onChange={(e) => {
              e.preventDefault();
              setval(e.target.value);
            }}
            autoFocus
          />

          <ButtonCustomized
            color="primary"
            onClick={() => {
              setstate(!state);
            }}
            height={3.5}
            width={6}
          >
            提交
          </ButtonCustomized>
        </div>
      </div>

      <div
        className="tw-h-16 tw-w-4/5 tw-bg-orange-500"
        onClick={() => {
          setstate(!state);
        }}
      >
        在这里添加任务
      </div>
    </div>
  );
}

标签:P2,..,缓缓,focus,React,--,state,input,useEffect
From: https://www.cnblogs.com/nulixuexipython/p/17086988.html

相关文章

  • ABC 288 ABC
    来水一篇博客,前面虽然打了挺多比赛,但是一直在忙项目和考试,没补题,那些就等补完题目再写完整的题解咯(:水多了也不好哈哈https://atcoder.jp/contests/abc288今天这场断层了......
  • ES6-11新特性学习笔记
    ......
  • Python pip install太慢,配置镜像提速
    转载链接:Python安装库太慢?配置好这个速度飞起-知乎(zhihu.com)经常听到初学python的小伙伴在抱怨,python安装第三方库太慢,很容易失败报错,如果安装pandas、tensorflow这......
  • OpenMMLab AI实战营 第三课笔记
    OpenMMLabAI实战营第三课笔记目录OpenMMLabAI实战营第三课笔记进入mmclassification目录导入工具包下载数据集数据集目录结构下载config配置文件命令行-训练用......
  • 20230204 - 解决 Delphi 10.4 IDE 提示 socket error 10038 Access violation coreide
    现象:Delphi Embarcadero®Delphi10.4Version27.0.40680.4203进入时,弹出以下四个错误提示框,内容如下:1、[WindowTitle]Error[Content]SocketError#10038So......
  • 产品经理笔记1
    定义1、市场分析:找准市场方向,确定哪个市场是值得进入的2、用户分析:针对目标市场的用户,分析他们的特征和需求,从而得到产品的需求和方向3、产品实现:组织相关的人力和资源......
  • [数据结构] 树、森林的遍历
    树的遍历树的遍历方式有先根遍历和后根遍历。在下面树的遍历中,采用的都是孩子兄弟表示法构建的树。树的先根遍历树的先根遍历步骤先根遍历就是先访问树的根节点,然后再......
  • vue之.sync的详解
    vue之.sync的详解:https://blog.csdn.net/chenxi_li/article/details/118682708?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~d......
  • MAUI新生2.5-数据绑定和MVVM:MVVM的属性验证
    一、MVVM的属性验证案例Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以......
  • 下一个更大元素
    nums1 中数字 x 的下一个更大元素是指 x 在 nums2中对应位置右侧的第一个比 x 大的元素。给你两个没有重复元素的数组 nums1和 nums2,下标从0开始......