[Day16] 学 Reactstrap 就离 React 不远了 ~ 用 Tooltips 认识 useEffect

前言

昨天文章有提到在 Tooltips 看到有趣的范例,
有用到 useEffect
不过我有将范例做些微调整,
让刚入手的人比较好理解~

本日正文

今天要介绍的就是 useEffect,
(附一下官网文件连结,但我觉得对初学者来说满不友善的就是了XD)
这边直接拿昨天的例子进行修改,
先给大家看以下程序码跟它的结果:

  • 程序码
import "../node_modules/bootstrap/dist/css/bootstrap.min.css";
import React, { useState, useEffect } from "react";
import { Tooltip, Button } from "reactstrap";

export default function App() {
  const [tooltipOpen, setTooltipOpen] = useState(false);
  const toggle = () => setTooltipOpen(!tooltipOpen);

  const shortText = "够了喔!";
  const longText = "今晚我想来点...";
  const [text, setText] = useState(shortText);
  const [isExpanded, setIsExpanded] = useState(false);

  useEffect(() => {
    if (isExpanded === true) {
      setText(longText);
    } else {
      setText(shortText);
    }
  }, [isExpanded]);

  return (
    <div>
      <p className="p-2">
        戴资颖~戴资颖~第一名!
        <br />
        戴资颖~戴资颖~我爱你!
        <br />
        <Button
          color="link"
          id="ilovetty"
          href="#"
          className="p-0"
          onClick={() => setIsExpanded(!isExpanded)}
        >
          资颖~资颖~资颖
        </Button>
      </p>
      <Tooltip
        isOpen={tooltipOpen}
        target="ilovetty"
        toggle={toggle}
        placement="bottom"
      >
        {text}
      </Tooltip>
    </div>
  );
}
  • 结果

大家可以看到,
只要点击「资颖~资颖~资颖」的按钮,
Tooltip 的文字就会有所变动,
这是怎麽办到的呢?

大家可以先看到我在按钮的部份增加了 onClick 事件:

<Button
    ... (略)
	onClick={() => setIsExpanded(!isExpanded)}
>
  资颖~资颖~资颖
</Button>

经过两天的洗礼,大家现在看到这个 setIsExpanded 应该不陌生了,
往上看可以看到这行的宣告:

const [isExpanded, setIsExpanded] = useState(false);

也就是说有个变数 isExpanded,初始值为 false,
setIsExpanded 是改变 isExpanded 值的方法。

所以

onClick={() => setIsExpanded(!isExpanded)}

意思是当我点击这个按钮,我要执行 setIsExpanded,
将 isExpanded 的值改为 isExpanded 的相反值。

再来进入本日重头戏,
也就是我在今天范例新增的这部份:

const shortText = "够了喔!";
const longText = "今晚我想来点...";
const [text, setText] = useState(shortText);
const [isExpanded, setIsExpanded] = useState(false);

useEffect(() => {
    if (isExpanded === true) {
      setText(longText);
    } else {
      setText(shortText);
    }
}, [isExpanded]);

useEffect 是说当组件(页面)渲染完後,针对指定的部份侦测更新并执行。
(但我这句话可能讲得不好,推荐大家可以看之前大大写的文章 → [Day 17 - 即时天气] 页面载入时就去请求资料 - useEffect 的基本使用 )

先想一个情况,有时候当页面上内容有小变动(例如数字的变化),
是不是不会马上看到更新後的内容,
还需要按重新整理让画面重新渲染後才会看到更新呢?

useEffect 我觉得就像是去侦测页面的更新,
有更新的地方就去执行并渲染在页面上。
(并不是整个页面的重新渲染哦,是只去侦测改变的地方并执行动作)

useEffect(() => {
    if (isExpanded === true) {
      setText(longText);
    } else {
      setText(shortText);
    }
}, [isExpanded]);

所以 , [isExpanded]); 这边的意思是 useEffect 会去侦测 isExpanded 有没有改变,
有改变的话我就去执行里面的程序,
里面这段大家应该看得懂,
就是判断 isExpanded,true 的话就执行 setText,将 text 的值改成 longText;
反之,false 的话就执行 setText,将 text 的值改成 shortText;

可是这样你可能会问说那 Tooltip 的文字内容为什麽会跟着改呢?
因为这边我有做一个小变动:

<Tooltip ... (略)>
    {text}
</Tooltip>

注意到了吗,原本在昨天的范例是「够了喔!」的文字,
我改成了 {text}

这也是 React 方便的地方之一,
我可以用 {变数名称} 去取得变数的值。
前面根据 isExpanded 的不同,text 就会被设定成不一样的值,
因此这边用 {text} 就可以去做到这样的变化。
很好玩吧!

最後再为大家整理一下今天这个范例的几个重点:

  1. <Tooltip> 的文字内容改为 {text}
  2. <Button> 新增 onClick 事件,去改变 isExpanded 的值
  3. 新增 useEffect 去侦测 isExpanded 的变化,
    根据 isExpanded 的不同,text 就会被设定成不一样的值

这样就可以做到点击後改变 Tooltip 的文字内容了。

是不是感受到 useEffect 的有趣之处了?
附上本日范例:Day16 - Reactstrap (Tooltips)
大家也可以自己试着玩玩看哦!

後记

我突然翻到在 Codecademy 上面有 React 的教学!
https://www.codecademy.com/learn/react-101

Codecademy 里面有各种程序的教学,
如 HTML & CSS, Python, JavaScript..... 等,
过程是把学习步骤拆成一步一步,
每一步都有附上说明,还有小练习,
所以你可以自己慢慢学习~

我之前在 Codecademy 学过 HTML, jQuery,
没想到 Codecademy 连学习证书都有,跟 Udemy 好像XD
这边附一下我当初的学习证书XD
https://ithelp.ithome.com.tw/upload/images/20210918/201298731BA11QeYFn.png

没想到现在连 React 教学都有了!
决定接下来要在 Codecademy 加(ㄜˋ)强(ㄅㄨˇ)我的 React 基础,
也会同步在文章 po 出我的学习过程,
那我们明天见啦!


<<:  新新新手阅读 Angular 文件 - ngIf - Day18

>>:  D3JsDay03可缩放向量图型 不用怕图片不行—SVG简介

盘点清查与检测扫描

适用人员: 资安人员/技术人员。 适用法规: 资通安全责任等级分级办法 - 附表十资通系统防护基准....

Day 29 - ROS 树莓派光达履带小车实作 (3)

昨天把lidar配置完成,并且准备好做SLAM的工具,但还有一个最重要的功能就是,让车子动起来~~ ...

DAY 23:Facade Pattern,由统一的入口介面来做事

什麽是 Facade Pattern? 实作不依赖多个类别,而是依赖介面,并把这些类别实作在此介面 ...

[Day 17]独自一人的全端攻略(前端篇)

挑战目标: MockNative Camp 最近这两年在工作上一直想要有同事可以交流进步,或者是遇到...

[EXCEL]危险的SUMIFS函数

前言 SUMIFS函数从EXCEL 2010开始出现之後,我很庆幸可以少写一些阵列公式。 这个函数可...