如何处理打字稿中的状态?

Posted

技术标签:

【中文标题】如何处理打字稿中的状态?【英文标题】:How to handle states in typescript? 【发布时间】:2022-01-21 13:48:41 【问题描述】:

您好,我是打字稿的新手,我有工作要做。 我需要制作动态类,类似于下面的代码。

import React,  ReactNode, useState  from "react";

interface Props 
  text: ReactNode;


const ListItem = ( text : Props) => 
    let [showMore, setShowMore] = useState(false);

    return (
        <div className="item">
            <div>
                <div className=`text $showMore ? "active" : ""`>text</div>
            </div>
            <button onClick=() => setShowMore((s) => !s)>Show more</button>
        </div>
    );
;

但是我需要在这段代码中实现它,我不知道该怎么做,因为我不理解编写它的人的这种语法。 当我尝试实现以前的代码时,我遇到了用这种语法渲染的反应钩子的问题。

希望你能理解我的问题

type DeliveryBranchHitProps = 
  hit: SearchIndex.DeliveryBranch;
;
const DeliveryBranchHit = (
  hit: delivery_branch,
: DeliveryBranchHitProps): JSX.Element => (
  <>
      <div className=`branch-opening-week $showMore ? "active" : ""`>
        <p>
          <span className="branch-day">Monday:</span>
          delivery_branch.opening_monday
        </p>
        <button onClick=() => setShowMore((s) => !s)>Show more</button>

    </div>
  </>
);

【问题讨论】:

“我在这种语法中渲染反应钩子时遇到问题”是什么意思,你能给我们举个例子吗? 它给了我无效的钩子调用错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。 【参考方案1】:

请查看这篇文章以了解const func = () =&gt; ( .. ) 语法Arrow function without curly braces

现在你的函数返回一个 single 表达式 - 即一些 JSX。要添加一些额外的逻辑,您需要使您的函数多行(注意大括号):

const Func = (props) => 
  // your hook goes here
  let [state, useState] = useState();

  // return the jsx
  return ( .. )

UPD:所以你的情况是:

type DeliveryBranchHitProps = 
  hit: SearchIndex.DeliveryBranch;
;
const DeliveryBranchHit = (
  hit: delivery_branch,
: DeliveryBranchHitProps): JSX.Element => 
 let [showMore, setShowMore] = useState(false);

return (
  <>
      <div className=`branch-opening-week $showMore ? "active" : ""`>
        <p>
          <span className="branch-day">Monday:</span>
          delivery_branch.opening_monday
        </p>
        <button onClick=() => setShowMore((s) => !s)>Show more</button>

    </div>
  </>
);


【讨论】:

谢谢,我了解函数式组件的语法,但我不了解这个jsx元素语法。你不知道如何重做功能组件吗? 您的组件是一个完全有效的功能组件。你需要做的是给它添加钩子。为此,您需要将函数(“组件”)从单行转换为常规多行。 非常感谢你【参考方案2】:

不太确定我是否理解你的问题,但可能你想做这样的事情,你有一个通用组件,它需要一些内容chilren


interface Props 
  text: ReactNode;
  children: ReactNode;


const ListItem = ( text, children : Props) => 
  let [showMore, setShowMore] = useState(false);

  return (
    <div className="item">
      <div>
        <div className=`text $showMore ? "active" : ""`>
          text
          children
        </div>

        <button onClick=() => setShowMore((s) => !s)>Show more</button>
      </div>
    </div>
  );
;

type DeliveryBranchHitProps = 
  hit: SearchIndex.DeliveryBranch;
;

const DeliveryBranchHit = ( hit: delivery_branch : DeliveryBranchHitProps): JSX.Element => (
  <>
    <ListItem text=delivery_branch.name />
      <p>
        <span className="branch-day">Monday:</span>
        delivery_branch.opening_monday
      </p>
    </ListItem>
  </>
);

【讨论】:

以上是关于如何处理打字稿中的状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 React / Flux 组件中的状态转换

你如何处理无状态 grails 服务中的共享数据

如何处理模块和打字稿类型的笑话模拟功能

如何处理返回 PartialView 的 ajax 调用控制器操作中的模型状态错误

如何使用打字稿中的查找来推断类型化的 mapValues?

如何处理角度 6 中的多个 mat-slide-toggle 标签?