回答編集履歴

3

テキスト修正

2022/11/20 04:37

投稿

退会済みユーザー
test CHANGED
@@ -53,7 +53,7 @@
53
53
  ```javascript
54
54
  blog.tags.indexOf(tag) > -1
55
55
  ```
56
- は(blog.tagsの要素であるタグ文字列の前後には空白文字は無いでしょうから)true になることがないです。
56
+ は(blog.tagsに含まれタグ文字列の前後には空白文字は無いでしょうから)true になることがないです。
57
57
 
58
58
  もし上記の確認によって、実際に前後に空白文字が含まれていた場合は何らかの対策をして、前後の余分な空白文字が無い文字列が setTag に渡されるように修正する必要があります。
59
59
 

2

説明文修正

2022/11/20 04:02

投稿

退会済みユーザー
test CHANGED
@@ -28,8 +28,8 @@
28
28
  [setTag]
29
29
  );
30
30
  ```
31
-
31
+ という関数を作っておきます。(このような、子コンポーネントのpropに渡すコールバック関数の名前の先頭を `handle`にするのが慣習となっていることがあります。)
32
- という関数を作っておきます。追加する場所はとりあえず、`const [tag, setTag] = useState("");` の次の行あたりが分かりやすいかと思います。そして、これを <RightBar /> の prop `setTag` に渡すようにします。
32
+ 追加する場所はとりあえず、`const [tag, setTag] = useState("");` の次の行あたりが分かりやすいかと思います。そして、これを <RightBar /> の prop `setTag` に渡すようにします。
33
33
 
34
34
  ```diff
35
35
  <RightBar
@@ -38,17 +38,17 @@
38
38
  + setTag = {handleChangeTag}
39
39
  ```
40
40
 
41
- こうすると setTag が実行される直前で
41
+ こうすると、(useCallbackによってメモ化された) handleChangeTag関数の中で setTag(text); が実行される直前で
42
42
  ```javascript
43
43
  console.log(`<${text}>`);
44
44
  ```
45
- が実行されますが、このときのログが `<`とタグの間あるいはタグと`>` の間に空白や改行があると、たとえば タグが `社会`であるとして
45
+ が実行されますが、このときのログが `<`とタグの間あるいはタグと`>` の間に空白や改行があって、たとえば タグが `社会`であるとして
46
46
  ```
47
47
  "<
48
48
  社会
49
49
  >"
50
50
  ```
51
- といったようなものになっているならば、このような前後に空白文字を含むまま setTag に渡されて tag として更新されるので filter の条件である
51
+ といったようなものになっているならば、このような前後に空白文字を含むまま setTag に渡されて tag として更新されるので filter の条件である
52
52
 
53
53
  ```javascript
54
54
  blog.tags.indexOf(tag) > -1

1

追記

2022/11/20 03:30

投稿

退会済みユーザー
test CHANGED
@@ -12,3 +12,49 @@
12
12
  >
13
13
  > change イベントは <input>, <select>, <textarea> 要素において、ユーザーによる要素の値の変更が確定したときに発行されます。
14
14
  - [HTMLElement: change イベント](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/change_event)
15
+
16
+ ### 追記
17
+
18
+ 質問に追加されたソースコードを拝見して、おそらく原因(のひとつ)は Parent コンポーネントのstate `tag` を更新する `setTag` が呼ばれるときの引数の文字列の前後に余計な空白文字(スペースや改行)があることではないかと推測します。
19
+
20
+ これを確認する方法としては、useState で得た `setTag` をそのまま <RightBar />のprop に渡すのではなく、
21
+
22
+ ```javascript
23
+ const handleChangeTag = useCallback(
24
+ (text) => {
25
+ console.log(`<${text}>`); // 空白文字の存在を確認しやすくするため< と > で囲む。
26
+ setTag(text);
27
+ },
28
+ [setTag]
29
+ );
30
+ ```
31
+
32
+ という関数を作っておきます。追加する場所はとりあえず、`const [tag, setTag] = useState("");` の次の行あたりが分かりやすいかと思います。そして、これを <RightBar /> の prop `setTag` に渡すようにします。
33
+
34
+ ```diff
35
+ <RightBar
36
+ ・・・
37
+ - setTag = {setTag}
38
+ + setTag = {handleChangeTag}
39
+ ```
40
+
41
+ こうすると setTag が実行される直前で
42
+ ```javascript
43
+ console.log(`<${text}>`);
44
+ ```
45
+ が実行されますが、このときのログが `<`とタグの間あるいはタグと`>` の間に空白や改行があると、たとえば タグが `社会`であるとして
46
+ ```
47
+ "<
48
+ 社会
49
+ >"
50
+ ```
51
+ といったようなものになっているならば、このような前後に空白文字を含むまま setTag に渡されて tag として更新されるので filter の条件である
52
+
53
+ ```javascript
54
+ blog.tags.indexOf(tag) > -1
55
+ ```
56
+ は(blog.tagsの要素であるタグ文字列の前後には空白文字は無いでしょうから)true になることがないです。
57
+
58
+ もし上記の確認によって、実際に前後に空白文字が含まれていた場合は何らかの対策をして、前後の余分な空白文字が無い文字列が setTag に渡されるように修正する必要があります。
59
+
60
+