【问题标题】:Is it bad practice to accept setState as a function parameter in React?在 React 中接受 setState 作为函数参数是不好的做法吗?
【发布时间】:2022-01-25 08:24:47
【问题描述】:

基本上,在将图像上传到 Firebase 之前,我会尝试将输入控制为:

export const controlThumbnail = (selectedThumbnail, setThumbnailError) => {
  if (!selectedThumbnail) {
    setThumbnailError('Please select a thumbnail!');

    return;
  }

  if (!selectedThumbnail.type.includes('image')) {
    setThumbnailError('Please select an image!');

    return;
  }

  if (selectedThumbnail.size > 1000000) {
    setThumbnailError('Image size must be less than 1MB!');

    return;
  }

  setThumbnailError(null);
};

我把上面的方法从 /lib/controlThumbnail.js 调用到:

import { controlThumbnail } from '../../lib/controlThumbnail';
    
const Signup = () => {
  const [userInfo, setUserInfo] = useState({
    name: '',
    email: '',
    password: '',
    thumbnail: null
  });
  const [thumbnailError, setThumbnailError] = useState(null);


  const userInputHandler = (e) => {
    setUserInfo((prevUserInfo) => {
      if (e.target.name === 'thumbnail') {
        const thumbnail = e.target.files[0];
        controlThumbnail(thumbnail, setThumbnailError);

        return { ...prevUserInfo, thumbnail };
      } else {
        return { ...prevUserInfo, [e.target.name]: e.target.value };
      }
    });
  };
...

所以,这现在可以正常工作,但我想知道这是否是这样做的好方法?还是应该把控制方法放在组件里面,不给 setState 作为参数?

【问题讨论】:

  • 为什么不直接从controlThumbnail()返回错误信息,然后设置为state呢?如果它仅生成错误消息,为什么将其命名为“控制缩略图”?我认为没有必要将设置状态的责任传递给它。我也不确定你为什么不使用else ifs。
  • @Vektor 哦,是的,我只是按照你说的做了,让它在'if' 之一匹配时只返回字符串,或者返回 null。现在我没有通过设置状态的责任,这让我很困扰。呃,它应该被命名为 checkThumbnail 还是什么?我不在那里使用 else ifs,因为我认为这些案例(如果存在,大小和类型)彼此不相关,我的意思是如果我还需要检查 pdf 的类型,我将 else if 添加到第二个...这是错的吗?
  • 从理论上讲,else if 可以工作,但在这种情况下没有必要。

标签: javascript reactjs frontend


【解决方案1】:

这是主观的。就个人而言,我认为controlThumbnail 函数不是进行该抽象的正确位置。在这里,您实际上只是提供验证。您无需赋予它验证和设置某些状态的责任。

您可以创建一个纯验证函数,并使用它的返回来更新您的Signup 组件中的状态:

const validateThumbnail = (thumbnail) => {
  if (!thumbnail) {
    return 'Please select a thumbnail!';
  }

  if (!thumbnail.type.includes('image')) {
    return 'Please select an image!'
  }

  if (thumbnail.size > 1000000) {
    return 'Image size must be less than 1MB!'
  }

  return null
}

const Signup = () => {
  const [userInfo, setUserInfo] = useState({
    name: '',
    email: '',
    password: '',
    thumbnail: null
  });
  const [thumbnailError, setThumbnailError] = useState(null);


  const userInputHandler = (e) => {
    setUserInfo((prevUserInfo) => {
      if (e.target.name === 'thumbnail') {
        const thumbnail = e.target.files[0];
        setThumbnailError(validateThumbnail(thumbnail));
        return { ...prevUserInfo, thumbnail };
      }
      return { ...prevUserInfo, [e.target.name]: e.target.value };
    });
  }
}

【讨论】:

  • 是的,我就是这么做的,谢谢你的帖子,为了简单起见,这个验证函数可以放在某个 lib 文件中还是保留在组件中?
  • 我的经验法则是在需要重复使用两次以上时进行抽象。
  • @imaskingbruh 以您认为最有意义的为准。如果您想在其他地方重新使用验证,将其移动到 lib 文件会很好。如果你只在这里使用它,并且组件很小,那就把它留在这里。如果它长大了,你可以随时移动它。
猜你喜欢
  • 2020-06-19
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
相关资源
最近更新 更多