当前位置: 首页 > 面试题库 >

无状态组件中的功能?

司空海荣
2023-03-14
问题内容

我正在尝试将<canvas>在这里找到的这个很棒的动画转换为React可重用的组件。看来此组件将需要一个父组件作为画布,而许多子组件则为function Ball()

出于性能方面的考虑,将它们Balls变成无状态组件可能会更好,因为会有很多这样的组件。我不熟悉制作无状态组件,并且想知道应该在哪里定义this.update()和中定义的和this.draw函数function Ball()

无状态组件的功能是在组件内部还是外部?换句话说,以下哪个更好?

1:

const Ball = (props) => {
    const update = () => {
        ...
    }

    const draw = () => {
        ...
    }

    return (
       ...
    );
}

2:

function update() {
     ...
}

function draw() {
     ...
}

const Ball = (props) => {
    return (
       ...
    );
}

每种都有什么优点/缺点,其中哪一种对我的特定用例而言更好?


问题答案:

首先要注意的是,无状态功能组件不能具有方法,如果它是无状态功能组件,则不应指望调用updatedraw呈现Ball

在大多数情况下,应在组件函数之外声明函数,以便仅声明一次,并始终重复使用相同的引用。当您在内部声明函数时,每次渲染组件时都会再次定义函数。

在某些情况下,您需要在组件内部定义一个函数,例如,将其分配为一个事件处理程序,该事件处理程序的行为取决于组件的属性。但是,您仍然可以在外部定义函数Ball并将其与属性绑定,从而使代码更简洁,并使updateor
draw函数可重用。

// You can use update somewhere else
const update (propX, a, b) => { ... };

const Ball = props => (
  <Something onClick={update.bind(null, props.x)} />
);

如果您使用的是 hooks
,则可以useCallback用来确保仅当函数的依赖项之一(props.x在这种情况下)发生更改时才重新定义该函数:

const Ball = props => {
  const onClick = useCallback((a, b) => {
    // do something with a, b and props.x
  }, [props.x]);

  return (
    <Something onClick={onClick} />
  );
}

这是 错误的方式

const Ball = props => {
  function update(a, b) {
    // props.x is visible here
  }

  return (
    <Something onClick={update} />
  );
}

使用时useCallbackupdateuseCallback挂钩本身中定义函数本身对我们来说,在组件外部进行设计决策比什么都重要,您应该考虑是否要重用update和/或是否需要访问组件闭包的范围,例如,读取/写入状态。我个人选择默认在组件内部定义它,并使其仅在需要时才可重用,以防止从一开始就过度设计。最重要的是,重用应用程序逻辑可以通过使用更具体的钩子来更好地完成,而将组件留作演示用。在使用钩子时在组件外部定义功能实际上取决于您希望为应用程序逻辑从React解耦的程度。



 类似资料:
  • 在不使用类的情况下,如何在react的功能性无状态组件中使用PropTypes?

  • 我目前有一个类组件和一个函数组件在我的主组件 以下是的代码段: 类组件 功能部件 因此,我想做的是通过按钮的onClick操作,从功能组件更改类组件的状态。我怎样才能完成任务?

  • 在React中,我编写了一个无状态功能组件,现在想向其添加Prop类型验证。 组件: 组件,渲染: 正如你在中看到的,我正在传递至。因为是一个字符串,我希望道具类型验证能够生效。相反,我在浏览器控制台中得到一个错误,因为字符串没有名为的方法。 为什么道具类型验证没有按预期工作?看看这个问题,情况似乎是一样的。

  • 我是新的反应,我正在尝试组件功能的风格。我有简单的待办事项清单。我想使用style属性从列表中删除todo项。从Chrome调试模式中,我看不到对复选框更改的即时反应,而且该项也没有删除。。。对我来说,这是如何管理组件状态的问题。我希望得到一些指导。 App.js Todos.js TodoItem.js 我希望这个getStyle()将遵循状态。。。以某种方式

  • 有了钩子,功能性React组件不再是无状态组件。它可以有状态,所以为功能组件定义状态接口是有意义的。 虽然打字稿不会抛出任何错误/警告,但最好定义一下。 需要帮助做同样的事情。

  • 我创建了一个包含登录组件和注册组件的签名页面组件。我的问题是,我如何传递一个onhtml函数从父到子,以便更改我的父组件(签名页组件)的状态?我期望的是,通过单击子组件中的按钮,可以切换父组件的活动状态,并根据活动状态更改样式。我试图通过一个处理功能从父到子,但它不能很好地工作。 有什么解决办法吗? codesandbox中的详细信息:https://codesandbox.io/s/wizard