Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将主组件的逻辑和状态拆分为多个文件_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 如何将主组件的逻辑和状态拆分为多个文件

Javascript 如何将主组件的逻辑和状态拆分为多个文件,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,昨天我问过如何才能“清理”我的App.js文件,并在不同的文件中分离逻辑、数学或效果函数,这样我的主文件就会很好阅读。对于如何使用自定义挂钩,我没有什么答案,他们给了我一个例子,但我真的不明白。我的计算器应用程序经过了几次代码更改,与我第一次请求时提供的代码相比 我试着去理解它是如何工作的,或者去阅读,但是没有任何帮助 第一件对我来说没有意义的事情是这个。我试过一些基本的定制钩子。到目前为止,为了实现这一点,我创建了文件OrangeButtonHook.js,其中包含 import React,

昨天我问过如何才能“清理”我的App.js文件,并在不同的文件中分离逻辑、数学或效果函数,这样我的主文件就会很好阅读。对于如何使用自定义挂钩,我没有什么答案,他们给了我一个例子,但我真的不明白。我的计算器应用程序经过了几次代码更改,与我第一次请求时提供的代码相比

我试着去理解它是如何工作的,或者去阅读,但是没有任何帮助

第一件对我来说没有意义的事情是这个。我试过一些基本的定制钩子。到目前为止,为了实现这一点,我创建了文件OrangeButtonHook.js,其中包含

import React, { useState } from 'react';

export default function useOrangeButtonHook(operator){
const [whichOrange,setWhichOrange] = useState({
    whichOrange : 'there should be some text'
})

return whichOrange;
}
在我的App.js文件中,我只是简单地导入它,并按照他们在回答我之前的问题时向我展示的那样使用它

import useOrangeButtonHook from './Components/OrangeButtonHook';

const {whichOrange, setWhichOrange} = useOrangeButtonHook();
console.log(whichOrange) //this works ,and in my console is 'there should be some text'
但为了更好地理解,我尝试将它重命名为对我更有意义的名称

//OrangeButtonHook.js
import React, { useState } from 'react';

export default function useOrangeButtonHook(operator){
const [whichOrange,setWhichOrange] = useState({
    button : 'there should be some text'
})

return whichOrange;
}
但当我尝试在App.js中调用它时,我的控制台显示“undefined”

 const {whichOrange, setWhichOrange} = useOrangeButtonHook();
 console.log(whichOrange) //throws undefined
所以我试着这样称呼它

 const {whichOrange, setWhichOrange} = useOrangeButtonHook();
 console.log(whichOrange.button) //this works throws lot of errors
我不明白问题出在哪里,也不明白应该如何将这些函数分离到不同的文件中。问题是,例如,当单击操作员按钮时,该函数应该添加对按钮有效的类

function turnOnOrange(operator){
  setNumber(prevState => ({
    ...prevState,
    whichOrange:operator
  }))
  operator.className = 'orangeActivated';
}

function turnOffOrange(){
 number.whichOrange.className = 'orangeDisabled';
 setNumber(prevState => ({
   ...prevState,
   whichOrange:null
  }))
}
但这些函数在getOperator()函数中调用,当用户单击operator按钮时调用该函数

 function getOperator(e){
   let operator = e.target;
     setNumber(prevState => ({
       ...prevState,
       operator:operator.name
     }))

    if(!number.whichOrange){
      turnOnOrange(e.target);
    }

    if(number.whichOrange){
      number.whichOrange.className='orangeDisabled';
      turnOnOrange(e.target)
    }
 }
几乎所有的操作和操作都是相互“链接”的。codesandbox的链接,这样您就可以看到整个计算器应用程序代码,并了解更多我所说的内容


如果有人向我解释或告诉我它是如何工作或如何做的,我将非常感激。谢谢。

首先,使用自定义钩子时,您将收到它返回的内容。您正在返回
whichrange
,这是一个对象
{按钮:“应该有一些文本”}
。您正试图从中提取
{whichrange,setwhichrange}
,而上面提到的对象中不存在该值

其次,定制钩子与使用React.useState是等价的,这是没有意义的。此外,定制钩子还用于提取公共逻辑,以便在多个地方使用

如果你想让代码更干净,你应该从将App.js中的逻辑分块开始。然后,您应该尝试提取公共逻辑,以便尽可能减少代码重复。接下来,您可以尝试简化逻辑,这样代码中的if语句就更少了

例如,看看这部分代码:

if(number.operator==“+”){
结果=第一个数字+第二个数字;
setNumber((prevState)=>({
…国家,
第一个数字:结果,
第二个号码:“,
结果:结果,,
操作员:“,
显示:PrettyNumber(结果),
numToReset:是的,
}));
resizeFinalNumber(PrettyNumber(结果));
//减去
}else if(number.operator==“-”){
结果=第一个数字-第二个数字;
setNumber((prevState)=>({
…国家,
第一个数字:结果,
第二个号码:“,
结果:结果,,
操作员:“,
显示:PrettyNumber(结果),
numToReset:是的,
}));
resizeFinalNumber(PrettyNumber(结果));
//倍增
}else if(number.operator==“x”){
结果=第一个数字*第二个数字;
setNumber((prevState)=>({
…国家,
第一个数字:结果,
第二个号码:“,
结果:结果,,
操作员:“,
显示:PrettyNumber(结果),
numToReset:是的,
}));
resizeFinalNumber(PrettyNumber(结果));
}
通过不太使用setNumber,您可以轻松地使其变得更短、更简单:

if(number.operator==“+”){
结果=第一个数字+第二个数字;
}else if(number.operator==“-”){
结果=第一个数字-第二个数字;
}else if(number.operator==“x”){
结果=第一个数字*第二个数字;
}
setNumber((prevState)=>({
…国家,
第一个数字:结果,
第二个号码:“,
结果:结果,,
操作员:“,
显示:PrettyNumber(结果),
numToReset:是的,
}));
resizeFinalNumber(PrettyNumber(结果));
在每个if语句中调用完全相同的函数是没有意义的。因此,我建议从这些东西开始(消除代码重复,将与React无关的函数提取到单独的文件中),直到后来才尝试使用定制挂钩来适应它们,或者分离不能只是简单函数的公共逻辑

再举一个例子:

//您可以在多个位置使用此函数
常量getOperationResult=(第一个数字、第二个数字、运算符)=>{
让结果;
如果(number.operator==“+”){
结果=第一个数字+第二个数字;
}else if(number.operator==“-”){
结果=第一个数字-第二个数字;
}else if(number.operator==“x”){
结果=第一个数字*第二个数字;
}
返回结果
}
const result=getOperationResult(第一个数字、第二个数字、操作);
setNumber((prevState)=>({
…国家,
第一个数字:结果,
第二个号码:“,
结果:结果,,
操作员:“,
显示:PrettyNumber(结果),
numToReset:是的,
}));
resizeFinalNumber(PrettyNumber(结果));
对于初学者,我要求您至少删除100行代码,并使每个文件的长度最多为100行;)

谢谢你的回答:)我不确定我是否达到了那个水平,所以我可以在100行以内完成。这就是我询问如何“清理”App.js文件的原因。但我会看一看,并试图摆脱可重复使用的代码@Naszos