当前位置: 首页 > 知识库问答 >
问题:

ReactJS正确使用有状态和无状态组件的方法?

袁玮
2023-03-14

我已经开始学习ReactJS,有一个关于无状态和有状态组件的问题。一般来说,我遵循组件和容器的分离,如下所示。有状态函数在组件文件夹中,其他逻辑操作在容器文件夹下。文件夹结构

让我们思考材料UI下拉列表。

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';

const useStyles = makeStyles(theme => ({
  button: {
    display: 'block',
    marginTop: theme.spacing(2),
  },
  formControl: {
    margin: theme.spacing(1),
    minWidth: 120,
  },
}));

export default function ControlledOpenSelect() {
  const classes = useStyles();
  const [age, setAge] = React.useState('');
  const [open, setOpen] = React.useState(false);

  const handleChange = event => {
    setAge(event.target.value);
  };

  const handleClose = () => {
    setOpen(false);
  };

  const handleOpen = () => {
    setOpen(true);
  };

  return (
    <div>    
      <FormControl className={classes.formControl}>
        <InputLabel id="demo-controlled-open-select-label">Age</InputLabel>
        <Select
          labelId="demo-controlled-open-select-label"
          id="demo-controlled-open-select"
          open={open}
          onClose={handleClose}
          onOpen={handleOpen}
          value={age}
          onChange={handleChange}
        >
          <MenuItem value="">
            <em>None</em>
          </MenuItem>
          <MenuItem value={10}>Ten</MenuItem>
          <MenuItem value={20}>Twenty</MenuItem>
          <MenuItem value={30}>Thirty</MenuItem>
        </Select>
      </FormControl>
    </div>
  );
}

为了打开和关闭下拉菜单handleClose()handleOpen()方法更改打开状态,这意味着它是有状态组件。但没有其他变化(省略年龄设置)。它似乎是可重用的组件,但包括状态与非常简单的操作,如打开和关闭。我应该放入哪个文件夹?容器还是组件?

共有1个答案

范侯林
2023-03-14

这些组件执行繁重的逻辑,并且主要是基于路由的,或者(更好地说是基于繁重的)基于逻辑的。

这些函数可以很小(也可以很大),但主要目的是它们可以在几个容器组件中使用,事件可以在其他函数组件中使用,函数组件的目的是信誉,如果它们保持某种状态(就像在您的情况下保持一个简单的钩子状态来跟踪切换),我可以说完全可以

大多数时候,您会发现自己在路由级别使用连接Redux的容器组件(我也应该注意到,现在不鼓励使用),以及嵌套在子组件内部的许多其他函数组件。

    null
 类似资料:
  • 在接口流中: 中间操作可分为有状态和无状态。它们影响并行流的结果。 只有两个终端操作是非确定性方法:findAny()和forEach(Consumer)。它们影响并行流的结果。 如果中间无状态操作执行惰性操作,它们可能会产生副作用。这会影响并行Stream的结果。 中间操作可分为以下几类: 有状态 不同的() 排序() 极限(长l) 跳过(长l) 无国籍 地图(功能f) 以下是我的两个问题: >

  • 我有两个React组件,即和使用了一些重要的UI组件,但我相信它们与我的问题无关。 在,使用effect调用,该函数解析为一个类别数组,例如,。 我的目标是访问父组件()中复选框的状态(选中或未选中)。我采取了这个问题中建议的方法。(见验证答案) 有趣的是,当我记录

  • 问题内容: 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心如果就地修改阵列可能会造成麻烦-是否安全? 制作数组副本的另一种选择似乎是浪费的。 问题答案: 该阵营的文档说: 将此this.state视为不可变的。 您将直接更改状态,即使您此后再次“重置”状态,也有可能导致易于出错的代码。F.ex,它可能导致某些生命周期方法(如不会触发)。 在更高版本的React中,建议的方法是在修改状态以

  • 问题内容: 我试图了解React的有状态和无状态组件之间的确切区别。好的,无状态组件只会做某事,但是什么也不会记住,而有状态组件可能会做同样的事情,但是它们会记住其中的内容。那是理论。 但是现在,在检查如何使用代码显示此内容时,我有点麻烦了。以下两个示例对吗?唯一的区别确实是函数的定义。 无状态组件的示例: 有状态组件的示例: 问题答案: 是的,那是有区别的。除了有 状态 组件,您还可以使用以下方

  • 我实际上正在学习reactjs,并且实际上正在开发一个小的TODO列表,包装在一个名为TODO的“父组件”中。 我决定将初始化移到componentDidMount内部,但这似乎是一个反模式,我需要另一个解决方案。你能帮我吗? 下面是我的实际代码:

  • 问题内容: 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心如果就地修改阵列可能会造成麻烦-是否安全? 制作数组副本的另一种选择似乎是浪费的。 问题答案: 该阵营的文档说: 将此this.state视为不可变的。 您将直接更改状态,即使您此后再次“重置”状态,也有可能导致易于出错的代码。F.ex,这可能会导致某些生命周期方法(如不会触发)。 在更高版本的React中,建议的方法是在修改状态