하이어+플러스! 직원용 구축 방법은 다음과 같습니다(UI - 회사).
33240 단어 tutorialprogrammingreactwebdev
개요: 회사와 관련된 모든 보기 및 기능, 호출된 모든 함수는 authSlice 감속기에서 가져옵니다.
회사 루트 페이지
인사이드
routes > company > company-page.tsx
렌더링할 구성 요소와 호출할 함수를 지원하는 가져오기companyReducer
. useParams
는 URL에 전달된 회사의 id
를 가져오는 데 사용됩니다. -> company/:id
경로. 마운트 시 ID로 DB에서 해당 회사를 가져옵니다. 명확히 하기 위해 이 데이터를 가져올 때 상태로 설정했습니다.import { useEffect } from 'react';
import { useParams } from 'react-router';
import BeatLoader from 'react-spinners/BeatLoader';
import { getCompany } from '../../app/features/company/companySlice';
import { useAppDispatch, useAppSelector } from '../../app/hooks';
import ViewCompany from '../../components/company/view-company.component';
const CompanyPage = () => {
const { id } = useParams();
const dispatch = useAppDispatch();
const { isLoading } = useAppSelector((state) => state.company);
useEffect(() => {
dispatch(getCompany(id));
}, [id, dispatch]);
return <>{isLoading ? <BeatLoader /> : <ViewCompany />}</>;
};
export default CompanyPage;
회사 구성요소 보기
인사이드
components > company > view-company.component.tsx
너무 긴 텍스트에 대한 도우미 메서드truncateString
를 만들었습니다. 텍스트가 최대 길이에 도달하면 표시됨...
import { useAppSelector } from '../../app/hooks';
import { truncateString } from '../../utils/truncateString';
기능
companyReducer
에서 회사 상태 가져오기const ViewCompany = () => {
const { company } = useAppSelector((state) => state.company);
return ({/* removed for simplicity */});
};
export default ViewCompany;
UI
간단히 말해서, 게시한 작업과 함께 회사 세부 정보(누구인지, 위치, 고용 등)를 렌더링합니다.
const ViewCompany = () => {
const { company } = useAppSelector((state) => state.company);
return (
<>
<section style={{ backgroundColor: '#252731' }} className="mb-3">
<div className="container mx-auto py-5 px-5 md:px-0 text-right text-white flex justify-between">
<div className="flex justify-center text-md text-slate-200">
{company.isHiring ? (
<p>We are hiring!</p>
) : (
<p>Not hiring at the moment</p>
)}
</div>
</div>
<div className="md:px-12 lg:px-24 max-w-7xl relative items-center w-full px-5 py-5 mx-auto">
<div className="mx-auto flex flex-col w-full max-w-lg mb-12 text-center">
<p className="mb-5 font-medium text-2xl text-white">
{company.companyName}
</p>
<img
alt="testimonial"
className="inline-block object-cover object-center w-20 h-20 mx-auto mb-8 rounded-full"
src="https://picsum.photos/200"
/>
<div className="flex justify-center">
{company.companyUrl ? (
<a
href={company.companyUrl}
className="text-base leading-relaxed text-indigo-500 border-r-2 border-gray-500 pr-2"
>
Company Website
</a>
) : null}
{company.companySize ? (
<p className="text-base leading-relaxed font-color pl-2">
Company size: {company.companySize}
</p>
) : null}
</div>
</div>
</div>
</section>
<ul
className="nav nav-tabs flex flex-col md:flex-row flex-wrap list-none border-b-0 pl-0 mb-4 text-white"
id="tabs-tabFill"
role="tablist"
>
<li className="nav-item flex-auto text-center" role="presentation">
<a
href="#tabs-homeFill"
className="
nav-link
w-full
block
font-medium
text-sm
leading-tight
uppercase
border-x-0 border-t-0 border-b-2 border-transparent
px-6
py-3
my-2
hover:border-transparent hover:bg-transparent
focus:border-transparent
active
"
id="tabs-home-tabFill"
data-bs-toggle="pill"
data-bs-target="#tabs-homeFill"
role="tab"
aria-controls="tabs-homeFill"
aria-selected="true"
>
About the company
</a>
</li>
<li className="nav-item flex-auto text-center" role="presentation">
<a
href="#tabs-profileFill"
className="
nav-link
w-full
block
font-medium
text-sm
leading-tight
uppercase
border-x-0 border-t-0 border-b-2 border-transparent
px-6
py-3
my-2
hover:border-transparent hover:bg-transparent
focus:border-transparent
"
id="tabs-profile-tabFill"
data-bs-toggle="pill"
data-bs-target="#tabs-profileFill"
role="tab"
aria-controls="tabs-profileFill"
aria-selected="false"
>
Jobs Posted
</a>
</li>
</ul>
<div className="tab-content font-color" id="tabs-tabContentFill">
<div
className="tab-pane fade show active w-full max-w-4xl"
id="tabs-homeFill"
role="tabpanel"
aria-labelledby="tabs-home-tabFill"
>
<p className="text-md px-10">{company.companyDescription}</p>
</div>
<div
className="tab-pane fade"
id="tabs-profileFill"
role="tabpanel"
aria-labelledby="tabs-profile-tabFill"
>
{company.jobs.length ? (
<section className="text-gray-600 body-font">
<div className="container py-5 mx-auto">
<div className="flex flex-wrap -m-4">
{company.jobs.map((job, index) => {
return (
<div className="p-4 md:w-1/2 w-full" key={index}>
<div className="h-full secondary-bg-color p-8 rounded">
<h2 className="mb-3 text-indigo-500">
<a href={job.applyUrl}>APPLY FOR JOB</a>
</h2>
<p className="leading-relaxed mb-6 font-color">
{truncateString(job.description, 250)}
</p>
<span className="flex-grow flex flex-col">
<span className="title-font font-medium text-white">
{job.position}
</span>
<div className="flex font-color">
<span className="text-sm">
{job.location.toUpperCase()}
</span>
<span className="text-sm mx-2">
{job.jobType.toUpperCase()}
</span>
<span className="text-sm">
${job.salary.toUpperCase()}
</span>
</div>
</span>
</div>
</div>
);
})}
</div>
</div>
</section>
) : (
<p className="text-md">No Jobs posted </p>
)}
</div>
</div>
</>
);
};
export default ViewCompany;
스크린샷
프로젝트의 UI/회사 부분은 여기까지입니다. 계속 지켜봐 주세요!
Reference
이 문제에 관하여(하이어+플러스! 직원용 구축 방법은 다음과 같습니다(UI - 회사).), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ajeasmith/hiring-platform-app-hireplus-heres-how-i-built-it-ui-company-3id텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)