하이어+플러스! 직원을 위해 내가 구축한 방법은 다음과 같습니다(Redux - 프로필).
18636 단어 tutorialwebdevreactprogramming
유형, 작업 및 리듀서: 프로필 상태
유형
인사이드
app > features > profile > profileTypes.ts
프로필의 데이터 유형. UpdatedFields
는 프로필 페이지를 업데이트하는 데 필요한 유일한 필드입니다.export type ProfileData = {
id: string;
email: string;
createdAt: number;
headline: string;
isForHire: boolean;
websiteURL: string;
skills: string[];
summary: string;
projects: ProjectData[];
experience: ExperienceData[];
};
export type ExperienceData = {
date: string;
position: string;
positionSummary: string;
};
export type ProjectData = {
date: string;
title: string;
summary: string;
github: string;
projectUrl: string;
};
export type UpdatedFields = {
id: string;
headline: string;
summary: string;
isForHire: boolean;
websiteURL: string;
skills: string[];
experience: ExperienceData[];
projects: ProjectData[];
};
행위
인사이드
app > features > profile > profileSlice.ts
프로필 감속기의 초기 상태입니다. getProfileById
는 id
에 의해 프로필을 가져오고 문자열화된 버전을 반환합니다. updateProfileById
프로필을 업데이트합니다.import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { getProfile, updateUserProfileById } from '../../../utils/firebase/firebase.utils';
import { signoutUser } from '../auth/authSlice';
import { ProfileData, UpdatedFields } from './profileTypes';
interface userState {
profile: ProfileData;
isLoading: boolean;
isEditting: boolean;
}
const initialState: userState = {
profile: {
id: '',
email: '',
createdAt: Date.now(),
headline: '',
isForHire: false,
websiteURL: '',
skills: [],
summary: '',
projects: [],
experience: [],
},
isLoading: false,
isEditting: false,
};
export const getProfileById = createAsyncThunk(
'profile/getProfileById',
async (id: string) => {
const profile = await getProfile(id);
const [profileObj] = profile;
return JSON.stringify(profileObj);
}
);
export const updateProfileById = createAsyncThunk(
'profile/updateProfileById',
async (data: UpdatedFields): Promise<void> => {
await updateUserProfileById(data);
}
);
감속기
setEditView
- 편집이 true로 설정된 경우 후보자가 자신의 프로필을 편집할 수 있는 편집 페이지가 표시됩니다.setProjects
- 편집 페이지에서 프로젝트를 설정합니다.setExperiences
- 편집 페이지에서 경험을 설정합니다.extraReducers:
응답 상태를 처리하고 그에 따라 상태를 설정했습니다.const profileSlice = createSlice({
name: 'profile',
initialState,
reducers: {
setEditView(state, action) {
state.isEditting = action.payload;
},
setProjects(state, action) {
state.profile.projects = action.payload;
},
setExperiences(state, action) {
state.profile.experience = action.payload;
},
},
extraReducers: (builder) => {
builder
.addCase(getProfileById.pending, (state) => {
state.isLoading = true;
})
.addCase(signoutUser.fulfilled, (state) => {
state.profile = {
id: '',
email: '',
createdAt: Date.now(),
headline: '',
isForHire: false,
websiteURL: '',
skills: [],
summary: '',
projects: [],
experience: [],
};
})
.addCase(getProfileById.fulfilled, (state, action) => {
state.isLoading = false;
state.profile = JSON.parse(action.payload);
})
.addCase(getProfileById.rejected, (state, action) => {
state.isLoading = false;
console.log('error with profile', action.error);
});
},
});
export const { setEditView, setProjects, setExperiences } =
profileSlice.actions;
export default profileSlice.reducer;
프로젝트의 프로필/리덕스 부분은 여기까지입니다. 계속 지켜봐 주세요!
Reference
이 문제에 관하여(하이어+플러스! 직원을 위해 내가 구축한 방법은 다음과 같습니다(Redux - 프로필).), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ajeasmith/hiring-platform-app-hireplus-heres-how-i-built-it-redux-profile-4k0l텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)