code output

组件的使用方法:

  import React from "react";
  import MyAvatars from "../../components/MyAvatar/MyAvatars";

  const About = () => {
   return (
  
    <MyAvatars
      topType={[true, 1000]}
      accessoriesType={[true, 1200]}
      facialHairType={["blank"]}
    />
   );
 };

 export default About;

这是我的密码. 我目前正在做这件事.

Code:

  import React from "react";
  import Avatar from "avataaars";
  import { Top, Accessories, FacialHair } from "./avatarThings";

  const MyAvatar = ({ topType, facialHairType }) => {
  
  const [avatar, setAvatar] = React.useState({
      avatarStyle: "Circle",
      topType: "ShortHairDreads01",
      accessoriesType: "Blank",
      facialHairType: "Blank",
});


const topFunc = () =>{
    if (topType.length === 2) {
      const interval = setInterval(() => {
        setAvatar((prev) => {
          return {
            ...prev,
            topType:  Top[Math.floor(Math.random() * Top.length)],
          };
        });
      }, topType[1]); //this is time
      return () => clearInterval(interval);
    }
    setAvatar((prev) => {
      return {
        ...prev,
        topType: topType[0],
      };
    });
}

const FacialHairFunc = () =>{
      if (facialHairType.length === 2) {
      const interval = setInterval(() => {
        setAvatar((prev) => {
          return {
            ...prev,
            facialHairType: FacialHair[Math.floor(Math.random() * FacialHair.length)],
          };
        });
      }, facialHairType[1]);
      return () => clearInterval(interval);
    }
    setAvatar((prev) => {
      return {
        ...prev,
        facialHairType: facialHairType[0],
      };
    });
}

React.useEffect(() => {

  if (topType) {
    topFunc()
  }
  if (facialHairType) {
    FacialHairFunc()
  }

}, [])


return (
  <Avatar
    avatarStyle="Circle"
    topType={avatar.topType}
    accessoriesType={avatar.accessoriesType}
    hairColor={avatar.hairColor}
    facialHairType={avatar.facialHairType}
  />

 );
};

export default MyAvatar;

我是编程新手. 我目前正在创建一个有用的open-source NPM Package.

这是它的密码. 一遍又一遍地重复相同的代码.

我希望我能更容易地修改这段代码,但我做不到.

如果你能帮忙,我会很高兴的.

请帮忙,并让我知道你的contribution.

谢谢:)

推荐答案

在有效计算随机属性的函数和更新化身状态的方面之间存在一些耦合.

我建议将 Select 随机属性并更新状态的每个"属性"函数转换为单个react 挂钩,该钩子接受属性数组和间隔,并返回随机属性,然后简单地将每个随机 Select 的属性直接传递给Avatar组件.没有令人信服的理由在您的组件中包含中间avatar状态.

示例:

const getRandomAttribute = arr => arr[Math.floor(Math.random() * arr.length)];

const useRandomAttribute = (attributes = [], valueArr = []) => {
  const [attribute, setAttribute] = useState(() => {
    if (valueArr[0]) {
      return getRandomAttribute(attributes);
    }
  });

  useEffect(() => {
    let timerId;
    if (valueArr[0] && valueArr[1] > 0) {
      timerId = setInterval(() => {
        const attribute = getRandomAttribute(attributes);
        setAttribute(attribute);
      }, valueArr[1]);
    }
    return () => clearTimeout(timerId);
  }, [attributes, valueArr]);

  return attribute;
};

应用程序

import React from "react";
import Avatar from "avataaars";
import { Top, Accessories, FacialHair, ..... } from "./avatarThings";

const MyAvatar = ({ topType, facialHairType, accessoriesType, hairType }) => {
  const accessory = useRandomAttribute(Accessories, accessoriesType);
  const face = useRandomAttribute(FacialHair, facialHairType);
  const hair = useRandomAttribute(Hair, hairType);
  const top = useRandomAttribute(Top, topType);

  return (
    <Avatar
      avatarStyle="Circle"
      topType={top || "ShortHairDreads01"}
      accessoriesType={accessory || "Blank"}
      hairColor={hair || "BrownDark"}
      facialHairType={face || "Blank"}
      clotheType="Hoodie"
      clotheColor="Red"
      eyeType="Wink"
      eyebrowType="Default"
      mouthType="Smile"
      skinColor="Brown"
    />
  );
};

您可以从这里调整代码的时间间隔、其他默认值/回退值等.

Edit how-to-do-condition-based-dont-repeat-yourself-dry-principle-in-react-js

Javascript相关问答推荐

如何从对象嵌套数组的第二级对象中过滤出键

使用typeof运算符获取对象值类型-接收字符串而不是数组

我不知道为什么我的JavaScript没有验证我的表单

如何从调整大小/zoom 的SVG路径定义新的d属性?""

无法访问Vue 3深度监视器中对象数组的特定对象值'

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

在浏览器中触发插入事件时检索编码值的能力

Webpack在导入前混淆文件名

如何使用TypeScrip设置唯一属性?

同一类的所有div';S的模式窗口

如何在 Select 文本时停止Click事件?

是否可以在Photoshop CC中zoom 路径项?

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

MongoDB中的嵌套搜索

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

更新文本区域行号

如何在加载页面时使锚定标记成为焦点

需要刷新以查看Mern堆栈应用程序中的更改

如何阻止外部脚本进入顶层导航

使用Java脚本在div中创建新的span标记