努力在样式对象上使用扩展运算符。我试图保留多个属性,但无法弄清楚如何干净利落地这样做
Struggling to use the spread operator on style objects. I'm trying to retain multiple properties but can't figure out how to do so cleanly
经典的待办事项列表项目。当我点击它以及悬停 on/off 时,我试图更新我的列表项的状态。当状态发生变化时,我正在努力保留我以前的所有属性。到目前为止,唯一的解决办法是在每个函数中指定每个 属性 并在我不希望它改变时给它 prevValue 。在我下面的代码中,我将此修复与我的删除线 textDecoration 一起使用来说明它何时起作用,但没有将它用于 fontStyle 和不透明度以查看当我不指定它或尝试替代方法时会发生什么。
我想有更好的方法可以做到这一点,但我很难将其描述得足够好以在网上找到一个好的答案。我认为这与传播运算符有关,但到目前为止我没有任何反应。感谢您的帮助!
import React, { useState } from "react";
function ToDoItem(props) {
const [textStrike, setStrikeState] = useState(false);
const [textStyle, setTextStyle] = useState({
key: 0,
textDecoration: "none",
fontStyle: "normal",
opacity: "1"
});
function handleClick(prevValue) {
if (textStrike === false) {
setTextStyle({
textDecoration: "line-through",
fontStyle: "italic",
opacity: "0.4"
})}
else {
setTextStyle({
textDecoration: "none",
fontStyle: "normal",
opacity: "1"
})}
setStrikeState(prevValue => !prevValue);
console.log("textStrike boolean value is " + textStrike);
}
function hoverOnHandle(prevValue) {
setTextStyle({
textDecoration: prevValue,
textShadow: "1px 1px lightgray"
});
}
function hoverOffHandle(prevValue) {
setTextStyle({
textDecoration: prevValue,
textShadow: ""
});
}
return (
<li
onClick={handleClick}
onMouseOver={hoverOnHandle}
onMouseOut={hoverOffHandle}
style={textStyle}
>
{props.text}
</li>
);
}
export default ToDoItem;
你可以这样做:
setTextStyle({
...textStyle,
key_we_wish_to_change:new value
})
传播运算符会将键值对一对一地移动到新对象,但由于您只覆盖了一个值,因此所有其他值都保持不变。
如果您只想更新或添加某些属性,可以使用
setTextStyle({
...textStyle,
yourProperty: yourValue
})
例如,如果你只想更新fontFamily,你可以
setTextStyle({
...textStyle,
fontFamily: 'Roboto'
});
经典的待办事项列表项目。当我点击它以及悬停 on/off 时,我试图更新我的列表项的状态。当状态发生变化时,我正在努力保留我以前的所有属性。到目前为止,唯一的解决办法是在每个函数中指定每个 属性 并在我不希望它改变时给它 prevValue 。在我下面的代码中,我将此修复与我的删除线 textDecoration 一起使用来说明它何时起作用,但没有将它用于 fontStyle 和不透明度以查看当我不指定它或尝试替代方法时会发生什么。
我想有更好的方法可以做到这一点,但我很难将其描述得足够好以在网上找到一个好的答案。我认为这与传播运算符有关,但到目前为止我没有任何反应。感谢您的帮助!
import React, { useState } from "react";
function ToDoItem(props) {
const [textStrike, setStrikeState] = useState(false);
const [textStyle, setTextStyle] = useState({
key: 0,
textDecoration: "none",
fontStyle: "normal",
opacity: "1"
});
function handleClick(prevValue) {
if (textStrike === false) {
setTextStyle({
textDecoration: "line-through",
fontStyle: "italic",
opacity: "0.4"
})}
else {
setTextStyle({
textDecoration: "none",
fontStyle: "normal",
opacity: "1"
})}
setStrikeState(prevValue => !prevValue);
console.log("textStrike boolean value is " + textStrike);
}
function hoverOnHandle(prevValue) {
setTextStyle({
textDecoration: prevValue,
textShadow: "1px 1px lightgray"
});
}
function hoverOffHandle(prevValue) {
setTextStyle({
textDecoration: prevValue,
textShadow: ""
});
}
return (
<li
onClick={handleClick}
onMouseOver={hoverOnHandle}
onMouseOut={hoverOffHandle}
style={textStyle}
>
{props.text}
</li>
);
}
export default ToDoItem;
你可以这样做:
setTextStyle({
...textStyle,
key_we_wish_to_change:new value
})
传播运算符会将键值对一对一地移动到新对象,但由于您只覆盖了一个值,因此所有其他值都保持不变。
如果您只想更新或添加某些属性,可以使用
setTextStyle({
...textStyle,
yourProperty: yourValue
})
例如,如果你只想更新fontFamily,你可以
setTextStyle({
...textStyle,
fontFamily: 'Roboto'
});