回答編集履歴
3
テキスト修正
test
CHANGED
@@ -53,7 +53,7 @@
|
|
53
53
|
```javascript
|
54
54
|
blog.tags.indexOf(tag) > -1
|
55
55
|
```
|
56
|
-
は(blog.tags
|
56
|
+
は(blog.tagsに含まれる各タグ文字列の前後には空白文字は無いでしょうから)true になることがないです。
|
57
57
|
|
58
58
|
もし上記の確認によって、実際に前後に空白文字が含まれていた場合は何らかの対策をして、前後の余分な空白文字が無い文字列が setTag に渡されるように修正する必要があります。
|
59
59
|
|
2
説明文修正
test
CHANGED
@@ -28,8 +28,8 @@
|
|
28
28
|
[setTag]
|
29
29
|
);
|
30
30
|
```
|
31
|
-
|
31
|
+
という関数を作っておきます。(このような、子コンポーネントのpropに渡すコールバック関数の名前の先頭を `handle`にするのが慣習となっていることがあります。)
|
32
|
-
|
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
追記
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
|
+
|