【问题标题】:How to use array of colors to change button background color on button press?如何使用颜色数组更改按钮按下时的按钮背景颜色?
【发布时间】:2021-02-23 21:14:34
【问题描述】:

在 ReactJS 中,我想使用功能组件来更改按钮按下时的背景颜色。颜色应该存储在一个数组中,当按下按钮时应该循环更改背景颜色。

这是我尝试过的:

import React, { useState } from "react";

export default function Button(props) {
    const [colors, setColour] = useState(['red', 'green', 'blue', 'orange', 'yellow']);

    const changeBtncolor = () => {
        setColour();
    }

    return (
        colors.map((color, id) => {
            return
            <Button key={id} type="button"
            style={{backgroundColor: color}}
            onclick={changeBtncolor(props)}>Change color
            </Button>
        })
    )
}

【问题讨论】:

  • 您的问题不清楚(您说“the”按钮,但您为数组中的每种颜色创建一个,您说“更改背景颜色”但您没有说什么)和您的代码没有意义(colours 开始一个数组,但是当您单击按钮时,您将其设置为该数组中的单个值,至少如果您没有制作 this error,您会这样做。
  • 看来@kbkb 需要澄清这个问题。您至少想告诉我们对代码的期望,以便我们至少可以尝试以不同的方式解决它吗?
  • 抱歉,我的意思是“React 功能按钮组件,当单击按钮时,它将循环通过道具 (colors: string[]) 传递给组件的颜色数组,这样每次按钮被点击时,它会将按钮的颜色更改为数组中的下一个“
  • @kbkb 以简单的方式我们可以做到。我将为此编写一个非常简单的代码并更新我的答案,给我几分钟。
  • @kbkb 我已经回答了,而且我也有预览。看看这个。另请参阅What should I do when someone answers my question?

标签: reactjs react-functional-component


【解决方案1】:

首先。状态用于存储发生变化的事物。

颜色数组不会改变,所以不要将它存储在状态中。

选中的颜色会改变,所以把它保存在状态中。在这种情况下,您可以使用数组中颜色的索引来做到这一点。

接下来,当颜色发生变化时,您要选择下一个。这只是增加索引的问题。然而,当你走到尽头时,你可能想要循环回来。所以检查一下。

第三,既然你只想要一个按钮,那就只创建一个按钮。不要在那里循环颜色数组。

使用状态中的值来分配背景颜色。

onclick 在 React 中是 onClick

只需传递设置 nextColor 的函数。它不需要任何参数。

最后,如果你想要一个 HTML 按钮元素,那么它是&lt;button&gt;。以大写字母开头的 JSX 名称意味着您正在使用一个组件。有很多第三方 Button 组件,但您没有导入任何组件。在这里尝试使用&lt;Button&gt; 将递归地使用您刚刚创建的组件。


Live demo 是第三方托管的,由于依赖关系。

import React, { useState } from "react";

const colours = ['red', 'green', 'blue', 'orange', 'yellow'];

export function Button(props) {
    const [selectedColourIndex, setColourIndex] = useState(0);

    const nextColour = () => {
        const newColourIndex = selectedColourIndex + 1;
        if (colours[newColourIndex]) 
            setColourIndex(newColourIndex);
        else
            setColourIndex(0);
    }

    return (<button type="button" style={{backgroundColor: colours[selectedColourIndex]}}
            onClick={nextColour}>Change color</button>);
}

【讨论】:

    【解决方案2】:

    一个适合你的例子是:

    import React, { useState } from "react";
    
    export default function App() {
      const Colors = ["red", "green", "blue", "orange", "yellow"];
      return (
        <div className="App">
          <h1>Hello CodeSandbox</h1>
          <h2>Start editing to see some magic happen!</h2>
          {Colors.map((color, key) => (
            <Button Color={color} Colors={Colors} key={key} />
          ))}
        </div>
      );
    }
    
    function Button({ Color, Colors }) {
      const [color, setColor] = useState(Color);
      const handleChange = (e) => {
        e.preventDefault();
        setColor(Colors[Math.floor(Math.random() * Colors.length)]);
      };
      const style = {
        backgroundColor: color
      };
      return (
        <button onClick={handleChange} style={style}>
          Click Me!
        </button>
      );
    }
    

    演示:https://00qh5.csb.app/

    预览


    上一个答案:

    如果您在 return 语句后没有使用 (),则会出现错误。它在 JavaScript 中变为 Automatic Semicolon Insertion in JavaScript 并且不起作用。所以不要让return 语句挂起。

    你应该只对那些会改变的事情使用状态。不用于存储变量。

    另外,我会避免在这里使用片段&lt;&gt;&lt;/&gt;,因为它没有任何意义。所以我也删除了它。

    onClick={changeBtncolor(props)} 将立即执行changeBtncolor(props),因此您需要将其包装在处理函数中。

    您没有将任何值传递给changeBtncolor 函数内的setColour 函数,但您传递的是props,这并不清楚,所以我改变了函数现在的工作方式,通过使用颜色名称,而不是来自 props

    注意colorcolour 之间的区别。这是一个更新的 React 代码,可以按照您的期望运行。

    import React, { useState } from "react";
    
    export default function Button({ colour }) {
      const [colors, setColour] = useState([
        "red",
        "green",
        "blue",
        "orange",
        "yellow"
      ]);
    
      const changeBtncolor = color => {
        setColour(color);
      };
    
      return colors.map((color, id) => (
        <Button
          key={id}
          type="button"
          style={{ backgroundColor: color }}
          onclick={() => changeBtncolor(colour)}
        >
          Change color
        </Button>
      ));
    }
    

    【讨论】:

    • 点击那里的按钮不会改变任何东西的颜色,它只会抛出一个异常,因为colors被一个没有map属性的字符串替换。
    • @Quentin 你是对的!这是我当时写的最糟糕的答案。我应该修复代码还是应该完全删除我的答案? ?
    • 我认为这个问题在目前的状态下是无法回答的(只是因为他们所问的内容缺乏明确性,甚至没有计算尝试中的所有不同问题)。 YMMV。
    • 一旦这个问题被关闭并且 OP 没有返回,我打算删除这个答案。我只是为了这个答案而努力工作,只是发现这个问题无法回答! ?@昆汀
    • @Quentin 更新了我的答案。
    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2023-01-15
    相关资源
    最近更新 更多