我可以在 this.state 中将函数分配为 属性 吗?
Can I assign a function as a property in this.state?
我正在尝试使用 this.handleFormula 函数在 div 中呈现字符串的最后一个值。我将此函数分配给 this.state 中的公式,并将 this.state.formula 链接到 div。我正在尝试 console.log return 值,但仍然没有渲染任何内容,你知道这可能是什么问题吗?
这是我的代码笔:https://codepen.io/tonytony92/pen/bGdmbzx?editors=1111
this.state={
display:"0",
formula:this.handleFormula,
buttonState:[{key: 'AC',
col:'red',
key1:"AC"
},///and a bunch of other objects in array/// ] }
handleFormula(){
let str=this.state.display
console.log(str)
let newArr=str.match(/["/"+"x"-]/gi)
let newStr=""
if (Boolean(newArr)==false){//If no special characters are found in string ,return current display//
console.log(str)
return str
}
else{
for(let i=newArr.length-1;i>-1;i--){// if last value is a number concatenate it to a variable///
if(parseFloat(newArr[i])!==NaN){
newStr+=newArr[i]
}
else if(i===newArr.length-1&& parseFloat(newArr[i])===NaN){ // if last value is a specialChar return it///
return newArr[i]
}
else{ /// return numbers concatenated in variable///
return newStr
}
}
}
}
React 不渲染函数,就像它不渲染布尔值一样。
如果您想呈现函数声明(这没有多大意义),请在 div.
中使用 {this.state.formula.toString()}
而不是 {this.state.formula}
但是由于您希望渲染 handleFormula
的 return 值,因此如果 handleFormula
设置某些状态并且您可以只渲染那部分会更好状态。
为什么更好?因为设置新状态会导致重新渲染,您将始终在 UI 中看到新状态。呈现 this.state.formula
的 return 值将始终相同,您可能会将其视为错误。
N.B。将函数附加到状态是不寻常的,但它不应该引起任何类型的问题。由于性能原因,我一直看到人们在上下文提供程序中这样做:value={this.state}
他们将方法附加到状态。
你需要清理一下。你不能在状态下使用功能。状态仅适用于可以随时间变化的数据。
您可以查看我的实现并获得一些想法。
https://codesandbox.io/s/calculatorreact-gi30v
像buttonState,不应该是状态的一部分。它可以移动到 class 属性
this.buttonState = [
{ key: "AC", col: "red", key1: "AC" },
{ key: "/", col: "gray", key1: "divide", keypress: "o", divide: "/" },
{ key: "x", col: "gray", key1: "multiply", keypress: "j" },
// rest
{ key: "=", col: "gray", key1: "equals" },
{ key: ".", col: "gray", key1: "point", keypress: "n" },
{ key: "CC", col: "red", key1: "delete" }
];
为要在视图中显示的字符串添加一个新的状态属性
this.state = {
display: "0",
formula: this.handleFormula,
str: ""
};
当您想在执行公式后显示最新值时更新字符串。
handleFormula() {
let str = this.state.display;
let newArr = str.match(/["/"+"x"-]/gi);
let newStr = "";
if (newArr) {
return str;
} else {
for (let i = newArr.length - 1; i > -1; i--) {
if (parseFloat(newArr[i]) !== NaN) {
newStr += newArr[i];
} else if (i === newArr.length - 1 && parseFloat(newArr[i]) === NaN) {
return newArr[i];
} else {
return this.setState({str: newStr});
}
}
}
}
您可以查看我的实现并获得一些想法。
https://codesandbox.io/s/calculatorreact-gi30v
我正在尝试使用 this.handleFormula 函数在 div 中呈现字符串的最后一个值。我将此函数分配给 this.state 中的公式,并将 this.state.formula 链接到 div。我正在尝试 console.log return 值,但仍然没有渲染任何内容,你知道这可能是什么问题吗?
这是我的代码笔:https://codepen.io/tonytony92/pen/bGdmbzx?editors=1111
this.state={
display:"0",
formula:this.handleFormula,
buttonState:[{key: 'AC',
col:'red',
key1:"AC"
},///and a bunch of other objects in array/// ] }
handleFormula(){
let str=this.state.display
console.log(str)
let newArr=str.match(/["/"+"x"-]/gi)
let newStr=""
if (Boolean(newArr)==false){//If no special characters are found in string ,return current display//
console.log(str)
return str
}
else{
for(let i=newArr.length-1;i>-1;i--){// if last value is a number concatenate it to a variable///
if(parseFloat(newArr[i])!==NaN){
newStr+=newArr[i]
}
else if(i===newArr.length-1&& parseFloat(newArr[i])===NaN){ // if last value is a specialChar return it///
return newArr[i]
}
else{ /// return numbers concatenated in variable///
return newStr
}
}
}
}
React 不渲染函数,就像它不渲染布尔值一样。
如果您想呈现函数声明(这没有多大意义),请在 div.
中使用{this.state.formula.toString()}
而不是 {this.state.formula}
但是由于您希望渲染 handleFormula
的 return 值,因此如果 handleFormula
设置某些状态并且您可以只渲染那部分会更好状态。
为什么更好?因为设置新状态会导致重新渲染,您将始终在 UI 中看到新状态。呈现 this.state.formula
的 return 值将始终相同,您可能会将其视为错误。
N.B。将函数附加到状态是不寻常的,但它不应该引起任何类型的问题。由于性能原因,我一直看到人们在上下文提供程序中这样做:value={this.state}
他们将方法附加到状态。
你需要清理一下。你不能在状态下使用功能。状态仅适用于可以随时间变化的数据。
您可以查看我的实现并获得一些想法。 https://codesandbox.io/s/calculatorreact-gi30v
像buttonState,不应该是状态的一部分。它可以移动到 class 属性
this.buttonState = [
{ key: "AC", col: "red", key1: "AC" },
{ key: "/", col: "gray", key1: "divide", keypress: "o", divide: "/" },
{ key: "x", col: "gray", key1: "multiply", keypress: "j" },
// rest
{ key: "=", col: "gray", key1: "equals" },
{ key: ".", col: "gray", key1: "point", keypress: "n" },
{ key: "CC", col: "red", key1: "delete" }
];
为要在视图中显示的字符串添加一个新的状态属性
this.state = {
display: "0",
formula: this.handleFormula,
str: ""
};
当您想在执行公式后显示最新值时更新字符串。
handleFormula() {
let str = this.state.display;
let newArr = str.match(/["/"+"x"-]/gi);
let newStr = "";
if (newArr) {
return str;
} else {
for (let i = newArr.length - 1; i > -1; i--) {
if (parseFloat(newArr[i]) !== NaN) {
newStr += newArr[i];
} else if (i === newArr.length - 1 && parseFloat(newArr[i]) === NaN) {
return newArr[i];
} else {
return this.setState({str: newStr});
}
}
}
}
您可以查看我的实现并获得一些想法。 https://codesandbox.io/s/calculatorreact-gi30v