既存の配列を追加/削除/変更し、配置に影響しません.
1▼ユーザーアレイにプレイヤーを追加
🚫 配列に値を追加する場合は、既存の配列にpush値を追加できません.
💯 既存のシナリオに影響を与えないように、新しいシナリオを作成し、シナリオを変更する必要があります.
展開の使用
concatの使用 2▼ユーザー配列からユーザーを削除
ボタンを押すと、プレイヤーを削除させたい.
この場合、削除関数を指定するときは矢印関数として指定する必要があります. 🚫 deleteFunc()を直接指定すると、レンダリングと同時に要素が削除されます. 💯 関数を呼び出すのではなく、関数を追加する必要があります.
map関数を使用すると、配列内の要素を簡単に変更できます.
Active変数の状態を切り替えます.
この場合、上記の場合と同様に、既存のuser要素
変更した値のみを上書きするように変更します.
整理する
配列の特定の値を変更する場合は、spreadを使用して既存の配列に影響を与えないようにします.
配列内の各要素にアクセスする場合はmap関数を使用します.
map関数
map関数は,物品の固有値をキー値として一緒に置くことを提案する.
このようにしてこそ、動作がより速く、より効率的になります.
🚫 配列に値を追加する場合は、既存の配列にpush値を追加できません.
💯 既存のシナリオに影響を与えないように、新しいシナリオを作成し、シナリオを変更する必要があります.
//CreateUser.js
import React from 'react';
// 필요한 컴포넌트를 props 로 받아올 예정
// onchange : input 값이 바뀌게 될 때 호출하는 함수
// onCreate : 버튼을 눌렀을 때 항목을 추가해주는 함수
function CreateUser({ username,email,onChange,onCreate}) {
return (
<div>
<input
name="username"
placeholder="계정명"
onChange={onChange}
value={username}
/>
<input
name="email"
placeholder="이메일"
onChange={onChange}
value={email}
/>
<button onClick={onCreate}>등록</button>
</div>
);
}
export default CreateUser;
//App.js
import React, { useRef, useState } from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';
function App() {
// inputs라는 변수에 대해서
// 초기값 {username:'', email:''},
// 변경 함수는 setInputs
const [inputs, setInputs] = useState({
username:'',
email:'',
});
// inputs의 변수를 미리 빼오기
const {username, email} = inputs;
// 기존 객체에 영향이 없도록 Spread를 이용
const onChange = e => {
const {name,value} = e.target;
setInputs({
...inputs,
[name] : value
});
};
return (
<>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}/>
<UserList users={users}/>
</>
);
}
//App.js
const [users, setUsers]= useState([
{
id: 1,
username: 'doyeon',
email: '[email protected]'
},
{
id: 2,
username: 'woong',
email: '[email protected]'
},
{
id: 3,
username: 'woody',
email: '[email protected]'
}
]);
const onCreate = () => {
const user = {
id: nextId.current,
username,
email,
// username, email 대신 ...users 가능
};
// 새로운 객체 user를 만들어서 값 할당
// 기존의 배열 user는 건들이지 않고, user가 추가됨
// 기존 배열 users에 새로 만든 객체 user을 붙여줌
setUsers(users.concat(user));
setInputs({
username:'',
email:''
});
console.log(nextId.current); //4
nextId.current += 1;
}
既存オブジェクトusers
に新規オブジェクトuser
を追加する場合展開の使用
setUsers([...users, user]);
concatの使用
setUsers(users.concat(user));
ボタンを押すと、プレイヤーを削除させたい.
この場合、削除関数を指定するときは矢印関数として指定する必要があります.
//UserList.js
import React from 'react';
import './App.css';
function User({user, onRemove}){
const {username, email, id } = user;
return(
<div>
<b>{username}</b>
<span>({email})</span>
// 🔥 반드시 화살표 함수로 함수 넣어주기!!!!
<button onClick={() => onRemove(id)}>삭제</button>
</div>
);
}
function UserList({users, onRemove}){
return (
<div>
{
users.map(
(user,index) => (
<User
user={user}
key={user.id}
onRemove={onRemove}
/>
)
)
}
</div>
)
}
export default UserList;
//App.js
const onRemove = id => {
// user.id가 파라미터로 받은 id가 아닌 경우에만
// 새 리스트로 묶어서 반환해준다.
// 반환된 리스트를 setUsers로 업데이트 해준다.
setUsers(users.filter(user => user.id !== id))
}
return (
<>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}/>
<UserList users={users} onRemove={onRemove}/>
</>
);
}
3▼ユーザー配列からユーザーを削除map関数を使用すると、配列内の要素を簡単に変更できます.
const onToggle = id => {
setUsers(users.map(
user => user.id === id?
{ ...user, active: !user.active}
: user
))
}
パラメータとしてidを受信するuserを見つけます.Active変数の状態を切り替えます.
この場合、上記の場合と同様に、既存のuser要素
...user
を直接インポートできます.変更した値のみを上書きするように変更します.
整理する
配列の特定の値を変更する場合は、spreadを使用して既存の配列に影響を与えないようにします.
setState([...기존 배열, 새로 추가된 내용])
配列内の各要素にアクセスする場合はmap関数を使用します.
map関数
map関数は,物品の固有値をキー値として一緒に置くことを提案する.
users.map(
(user,index)
=> (<User user={user} key={index} />),
)
レンダリングの結果がどのオブジェクトを指しているかを正確に知るにはkey値が必要です.このようにしてこそ、動作がより速く、より効率的になります.
Reference
この問題について(既存の配列を追加/削除/変更し、配置に影響しません.), 我々は、より多くの情報をここで見つけました https://velog.io/@uoayop/기존-배열에-영향-주지-않고-추가-삭제-수정テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol