Front-End 기능만을 사용하여 주소록을 만들어보았다.
전화번호 등록
전화번호를 등록할 때는 기본적으로 이름, 전화번호, 이메일 input 3개 입력을 받았다.
input.jsx Constructor
constructor(props) {
super(props);
this.state = {
firstName: "",
lastName: "",
phoneNumber: "",
email: "",
};
}
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value,
});
};
연락처 생성
//연락처 생성
onCreate = (data) => {
this.setState(
{
userList: this.state.userList.concat({
...data,
id: this.id++,
isChecked: false,
}),
},
() => {
window.localStorage.setItem(
"userList",
JSON.stringify(this.state.userList)
);
}
);
};
DB 없이 개발을 진행하였으므로 새로고침을 하게 됐을 경우 모든 state의 데이터가 초기화된다.
localStorage는 브라우저에 정보를 저장할 때 사용할 수 있는 공간이다.
localStorage 기본 문법
//데이터추가
localStorage.setItem('key', 'value');
//데이터 조회
localStorage.getItem('key');
//데이터 삭제
localStorage.removeItem('key);
localStorage는 순전히 텍스트 자료형만 저장이 되기 때문에, Object자료형이나 array자료형은 바로 저장이 불가능하다.
그래서 JSON 형태로 바꿔 준 뒤 저장을 하면 된다.
이 과정을 위해 state에 userList를 JSON.parse 해서 저장을 해 주었다.
index.jsx constructor
constructor(props) {
super(props);
this.state = {
userList: JSON.parse(localStorage.getItem("userList")) || [],
isOpen: false,
isView: false,
isInput: false,
selectUser: [],
search: '',
};
}
이와 같이 데이터를 삽입하고 저장하면 localStorage에 정상적으로 등록되는 것을 볼 수 있다.
연락처를 등록했으면 다음으로 삭제를 해볼 수 있다.
삭제는 연락처가 등록될 때 각 리스트에 CheckBox를 통해 true 일 때 삭제할 수 있도록 구현하였다.
연락처 삭제
//연락처 삭제
onRemove = () => {
const { userList } = this.state;
const userFilter = userList.filter((user) => !user.isChecked)
this.setState(
{
userList: userFilter,
},
() => {
window.localStorage.setItem(
"userList",
JSON.stringify(this.state.userList)
);
}
);
};
등록된 userList에서 isChecked 가 true 인 것을 filter 하여 userList를 setState 해주었다.
localStorage를 callback 해준 이유는 저 콜백이 없다면 유저가 삭제는 되지만
localStorage에 바로 반영이 되지 않기 때문에 콜백을 통해 로직이 수행이 되면 같이 실행되도록 하기 위해 넣어주었다.
다음으로 연락처를 검색할 수 있는 기능이다.
더 좋은 방법이 있고 검색을 할 때마다 렌더링이 일어나지만 당장 해결할 방법을 찾지 못해 이런 식으로 구현하였다.
우선 render 부분에
연락처 검색
const userList = this.state.userList.filter((data) =>
data.lastName.toLowerCase().includes(this.state.search.toLowerCase())||
data.phoneNumber.toLowerCase().includes(this.state.search.toLowerCase()))
이와 같이 userList를 선언하고 연락처의 이름, 전화번호를 입력하면 포함되어 있는 것을 filter 해주었고
List에 출력하는 방식으로 구현을 하였다.
검색 버튼을 누르거나 , 엔터를 눌렸을 때 검색되게 하는 방법을 구현하고 싶었는데 현재 구조에서는 많은 것이 고쳐져야 할 것 같다.
잘못된 점, 개선해야할 점 댓글 얼마든지 환영합니다!