微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用反应颜色选择器更改背景颜色

如何解决使用反应颜色选择器更改背景颜色

我有一个部分,我希望用户能够使用 react color picker 和 react-redux 更改背景颜色,不幸的是,背景颜色没有更改/未更新为新颜色。

代码沙盒中的实时代码change background color

代码

  import React,{ useState,useEffect } from "react";
import { useSelector,usedispatch } from "react-redux";
import { ChromePicker } from "react-color";
import Details from "./Details";

const Settings = () => {
  const fields = useSelector((state) => state);
  const dispatch = usedispatch();
  const [colorRgb,setColorRgb] = useState("#000");

  useEffect(() => {
    updateColor();
  },[]);

  const updateColor = () => {
    dispatch({
      type: "change",name: "socialColor",value: colorRgb
    });
  };
  console.log("current color",colorRgb);
  console.log("current color",fields.color);
  return (
    <div>
      <div>
        <Details />
        <h1>Edit </h1>
        <div className="container">
          <ChromePicker
            renderers={false}
            color={colorRgb}
            onChange={(e) => setColorRgb(e.hex)}
          />
          <span
            className="testa"
            style={{
              background: fields.color,color: "#fff"
            }}
          >
            Change my background color
          </span>
        </div>
      </div>
    </div>
  );
};

export default Settings;

我的代码有什么问题。?

解决方法

您只需要在 rgba(r,g,b,a) 的语法中设置背景而不是 {r,a},这是无效的 css

import React,{ useState,useEffect } from "react";
import { useSelector,useDispatch } from "react-redux";
import { ChromePicker } from "react-color";

const Settings = () => {
  const fields = useSelector((state) => state);
  const dispatch = useDispatch();
  const [colorRgb,setColorRgb] = useState(fields.color);

  useEffect(() => {
    updateColor();
  },[]);

  const updateColor = () => {
    dispatch({
      type: "change",name: "socialColor",value: colorRgb
    });
  };
  console.log("current color",colorRgb);
  return (
    <div>
      <div>
        <h1>Edit </h1>
        <div className="container">
          <ChromePicker
            renderers={false}
            color={colorRgb}
            onChange={(e) => setColorRgb(e.rgb)}
          />
          <span
            className="testa"
            style={{
              background:
                "rgba(" +
                colorRgb.r +
                "," +
                colorRgb.g +
                "," +
                colorRgb.b +
                "," +
                colorRgb.a +
                ")",color: "#fff"
            }}
          >
            Change my background color
          </span>
        </div>
      </div>
    </div>
  );
};

export default Settings;
,

您只调用 updateColor 函数,该函数在组件挂载时调用 dispatch 一次。这没有任何意义,因为您的 redux 值将始终为黑色。

如果您想在组件中存储“待处理”更改,那么您可以使用本地组件状态并在点击“提交”按钮时调用 dispatch

可能您想在每次更改时调用 dispatch 并摆脱本地 useState

@ibra 关于需要将颜色对象格式化为字符串是正确的,但您可以更简洁地编写它。

在将对象存储到 redux 之前还是在检索它之后,是否要从对象转换为字符串取决于您。

import React from "react";
import { useSelector,useDispatch } from "react-redux";
import { ChromePicker } from "react-color";
import Details from "./Details";

export const rgbaString = ({r,a = 1}) => `rgba(${r},${g},${b},${a})`

const Settings = () => {
  const colorRgb = useSelector((state) => state.color);
  const dispatch = useDispatch();

  const onChangeColor = (e) => {
    dispatch({
      type: "change",name: "color",value: e.rgb
    });
  };
  
  return (
    <div>
      <div>
        <Details />
        <h1>Edit </h1>
        <div className="container">
          <ChromePicker
            renderers={false}
            color={colorRgb}
            onChange={onChangeColor}
          />
          <span
            className="testa"
            style={{
              background: rgbaString(colorRgb),color: "#fff"
            }}
          >
            Change my background color
          </span>
        </div>
      </div>
    </div>
  );
};

export default Settings;
,

如果您获得十六进制代码而不是 rgb,问题将得到解决

您的代码

   <ChromePicker
     renderers={false}
     color={colorRgb}
     onChange={(e) => colorChange(e.rgb)}
   />

必须

   <ChromePicker
     renderers={false}
     color={colorRgb}
     onChange={(e) => colorChange(e.hex)}
   />

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?