반응형
UI와 비즈니스 로직을 분리하는 Reactjs
대응이 처음이라 UI와 함께 많은 기능과 변수 초기화가 넘쳐나는 컴포넌트를 보는 것이 눈에 거슬립니다.분리할 수 있나요?
다음과 같은 기본 설정 대신.비즈니스 로직을 다른 파일로 분리하려면 어떻게 해야 합니까?
function MyComponent() {
const [data, setData] = useState('');
const someFunc = () => {
//do something.
};
... some 100-liner initializations
return (
...
)
}
네, 가능합니다.그것은 라고 불립니다.Separation of concern
.
다음과 같이 구성 요소 구조를 생성할 수 있습니다.
MyComponentDirectory
- useCustomHook
- Component
- helper
코드는 이것과 같을 것입니다.
후크
const useCustomHook = () => {
const [value, setValue] = useState('');
const handleClick = (value) => {
setValue(value)
//do something.
};
... some 100-liner initializations/business logic, states, api calls.
return {
value,
handleClick,
... // Other exports you need.
}
}
export default useCustomHook;
요소
function MyComponent() {
const {
value,
handleClick,
... // Other imports
} = useCustomHook()
return (
<Element value={value} onClick={handleClick} />
)
}
도우미
const doSomething = () => {}
편집
다음은 다음을 사용한 React 카운터 애플리케이션의 자세한 예입니다.Separation of concern
구조.
Directory
- App
- Counter
- useCounter
- helper
앱 컴포넌트
import Counter from "./Counter";
import "./styles.css";
export default function App() {
return (
<div className="App">
<Counter />
</div>
);
}
카운터 컴포넌트
import useCounter from "./useCounter";
const Counter = () => {
const { count, increaseCount, decreaseCount } = useCounter();
return (
<div>
<p>{count}</p>
<div>
<button onClick={increaseCount}>Increase</button>
<button onClick={decreaseCount}>Decrease</button>
</div>
</div>
);
};
export default Counter;
use카운터 훅
import { useState } from "react";
import numberWithCommas from "./helper";
const useCounter = () => {
const [count, setCount] = useState(9999);
const increaseCount = () => setCount(count + 1);
const decreaseCount = () => setCount(count - 1);
return {
count: numberWithCommas(count),
increaseCount,
decreaseCount
};
};
export default useCounter;
도우미 기능
const numberWithCommas = (x) => {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};
export default numberWithCommas;
다음은 Codesandbox의 작업 예입니다.
주의: 후크 대신 간단한 Javascript util 함수를 만들면 다른 후크, 그 함수의 컨텍스트에 액세스할 수 없습니다.
제가 사용하는 일반적인 접근법은 비즈니스 로직을 자체 파일로 분리하는 것입니다.myComponentHelper.js
또한 함수를 인수로 전달하고 변경을 반환하지 않으면 반응 상태를 사용하거나 변경할 수 없기 때문에 함수를 테스트하기 쉬워집니다.
myComponent/
myComponent.jsx
myComponentHelper.js
myComponentTest.js
// myComponent.js
import { someFunc } from './myComponentHelper';
function MyComponent() {
const [data, setData] = useState('');
const x = someFunc(data);
return (
...
)
}
// myComponentHelper.js
export const someFunc = (data) => {
//do something.
return something;
}
// myComponentTest.js
import { someFunc } from './myComponentHelper';
test("someFunc - When data is this - Should return this", () => {
const data = {...};
const result = someFunc(data);
expect(result).toEqual("correct business data");
});
비즈니스 로직을 다른 파일로 분리하는 방법은 다양합니다.
- 논리 또는 기본적으로 대응하는 파일에 필요한 함수를 가진 helperFile.js를 만듭니다.
- 사용자 지정 후크를 만드는 중입니다.자세한 내용은 공식 문서 또는 이 재생목록에서 확인할 수 있습니다(마지막 동영상 참조).
- 글로벌 상태 관리 방법 - 컨텍스트에서API 또는 Redux는 상태와 비즈니스 로직을 분리하기 위해 사용됩니다.
언급URL : https://stackoverflow.com/questions/69332889/reactjs-separation-of-ui-and-business-logic
반응형
'programing' 카테고리의 다른 글
material-ui 'createSvgIcon'이 '@material-ui/core/utils'에서 내보내지 않았습니다. (0) | 2023.02.13 |
---|---|
CRA에서 오픈브라우저를 비활성화하려면 어떻게 해야 하나요? (0) | 2023.02.13 |
Nested JSON 결과의 다이내믹 JSON 키를 해석하려면 어떻게 해야 합니까? (0) | 2023.02.13 |
Angularjs 입력 필드 포커스 이벤트? (0) | 2023.02.13 |
반응 아폴로 오류:불변 위반:컨텍스트에서 "클라이언트"를 찾을 수 없거나 옵션으로 전달되었습니다. (0) | 2023.02.13 |