[TIL]2021 1129-実戦種目第6週
17909 ワード
今日やったこと
reactでtextarea文字数を制限する
// 글자수 제한 함수
const checkTextLength = (e, maxLength, setLength) => {
let targetText = e.target.value;
let textLength = e.target.value.length;
if (textLength <= maxLength) setLength(e.target.value.length);
else {
e.target.value = targetText.substr(0, maxLength);
setLength(maxLength);
}
};
次は体現の画面です.入力した文字数に従って{length}/100でlength状態を更新します.textareaラベルにはサブラベルが入れられないので、外でdivで包み、中にp、textareaラベルを入れて、textareaのように見えるコンポーネントを構成しています.
reactionからdrop boxを作成する
本来はユーザーが勝手に位置を記入する方式なので、より正確な住所をフィルタして見せたいと思っています.
投稿CRUDは私が担当している部分なので、私が担当することにしました.
実装モードと同様です.
// 드롭다운 state
const [isDown, setIsDown] = useState(false);
const [region, setRegion] = useState(isRegion);
...
<LocationBox>
<DropDownBox>
{isEdit ? (
!isDown && !region ? (
<SelectText>{isRegion}</SelectText>
) : (
<SelectText>{region ? region : isRegion}</SelectText>
)
) : (
<SelectText>{region ? region : "지역 선택"}</SelectText>
)}
<DropDownIcon
style={{ cursor: "pointer" }}
onClick={() => {
setIsDown(!isDown);
}}
/>
</DropDownBox>
<TextInput
height="48px"
width="calc((100% / 3) * 2)"
border="1px solid #999"
padding="14px 16px"
borderNone
ref={locationRef}
onChange={(e) => {
checkTextLength(e, 100, setLocationLength);
setPost({ ...post, location: e.target.value });
}}
placeholder="카페 위치 (ex. 홍대 어딘가)"
value={
post && post.location
? post.location.substr(
post.location.indexOf(" ") + 1,
post.location.length
)
: ""
}
/>
</LocationBox>
)}
{isDown && (
<RegionListBox>
{regionList.map((r) => (
<Region
key={r}
onClick={() => {
setRegion(r);
}}
>
{r}
</Region>
))}
</RegionListBox>
)}
解決した問題
リクエストデータを送信するときは、「試行」+「詳細位置」を一緒に送信し、修正するときは2つ、1つはドロップダウンボックス、1つはtextareaに入れるので、ここで少し時間がかかりました.
->JavaScript文字列の組み込み方法で解決します.substr, indexOf
モード変更時には、本来、受信した位置情報を
post.location.split(" ")[0]
のように直接表示することで、locationを変更するとonChangeイベントが発生し、ドロップダウンボックスの位置情報も変化する.->次のコードに示すように、モードを変更するときにregion stateの初期状態値を
post.location.split(" ")[0]
に指定します.そうしないとnullに指定し、位置が変化しても影響を受けません. const isRegion = isEdit && post ? post.location.split(" ")[0] : null;
// 드롭다운 state
const [isDown, setIsDown] = useState(false);
const [region, setRegion] = useState(isRegion);
Reference
この問題について([TIL]2021 1129-実戦種目第6週), 我々は、より多くの情報をここで見つけました https://velog.io/@khakaa/TIL-2021-11-29-실전-프로젝트-6주차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol