【发布时间】:2021-10-08 18:22:37
【问题描述】:
我正在尝试制作一个仅用于练习的表情符号搜索应用程序,我有三个组件,第一个是“APP”,然后是一个“SearchBar”组件,它呈现搜索栏并呈现第三个组件,即“ EmojiContainer'应该根据从'SearchBar'组件传递给它的道具显示表情符号。在'SearchBar'组件中我有'emojiDescriptions'对象,它具有表情符号图标作为键和每个表情符号的描述作为值.示例:
'????': ['happy', 'smiley', 'smiling', 'smile', 'laugh', 'laughing', 'positive emotion', 'every emoji', '2']
,根据搜索栏输入过滤表情符号的过程已经解决,问题出在“EmojiContainer”组件中,当我第一次通过“npm start”启动应用程序时,表情符号正确显示,但页面没有完全加载,但是一旦我刷新它,表情符号就会消失,即使我在搜索栏中输入某些内容,我也没有显示任何表情符号,当我修改某些内容时也会发生同样的事情 在“EmojiContainer”中,所有表情符号都会显示,但页面没有完全加载,但是一旦我刷新它,表情符号就会消失。 这是我遇到过的最奇怪的问题。 这是“SearchBar”组件的代码:
import React, { useEffect, useState} from 'react';
import EmojiContainer from '../emoji-container/emojiContainer';
import { BeakerIcon } from '@heroicons/react/solid';
import './searchBar.scss'
export default function SearchBar() {
const [content, setContent] = useState('');
const [emojiIcons] = useState([])
useEffect(() => {
for (let i = 0; i < emotions.length; i++) {
emojiIcons.push(Object.keys(emojiDescriptions)[parseInt(emotions[i].slice(-1))])
}
});
// let emojiIcons = [];
let emojiDescriptions = {
'????': ['happy', 'positive emotion', 'smile', 'smiling', 'every emoji', '0'],
'????': ['happy', 'smiley', 'smiling', 'positive emotion', 'every emoji', '1'],
'????': ['happy', 'smiley', 'smiling', 'smile', 'laugh', 'laughing', 'positive emotion', 'every emoji', '2'],
'????': ['happy', 'smiley', 'smiling', 'smile', 'laugh', 'laughing', 'positive emotion', 'every emoji', '3'],
'????': ['happy', 'smiley', 'positive emotion', 'smile', 'every emoji', '4'],
'????': ['smile', 'smiling', 'every emoji', '5'],
'????': ['smile', 'smiling', 'upside down face', 'every emoji', '6'],
'????': ['wink', 'winky face', 'every emoji', '7'],
'????': ['naughty face', 'laugh', 'laughing', 'every emoji', '8'],
'????': ['happy', 'positive emotion', 'smile', 'smiling', 'every emoji', '9'],
'????': ['happy', 'smiley', 'smiling', 'positive emotion', 'every emoji', '10'],
'????': ['happy', 'smiley', 'smiling', 'smile', 'laugh', 'laughing', 'positive emotion', 'every emoji', '11'],
'????': ['happy', 'smiley', 'smiling', 'smile', 'humble', 'every emoji', '12'],
'????': ['kiss', 'affection', 'every emoji', '13'],
'????': ['kiss', 'affection', 'every emoji', '14'],
'????': ['innocent', 'innocense', 'every emoji', '15'],
'????': ['heart eyes', 'love', 'affection', 'cat', 'every emoji', '16'],
'????': ['heart eyes', 'love', 'affection', 'every emoji', '17'],
'????': ['angry', 'angry face', 'every emoji', '18'],
'????': ['angry', 'angry face', 'devil', 'devil face', 'every emoji', '19'],
'????': ['monster', 'angry monster', 'angry', 'every emoji', '20'],
'????': ['monster', 'every emoji', '21'],
'????': ['skull', 'every emoji', '22'],
'????': ['alien', 'every emoji', '23'],
'????': ['ghost', 'every emoji', '24'],
'????': ['robot', 'every emoji', '25'],
'????': ['poop', 'eww', 'gross', 'every emoji', '26'],
'????': ['sleep', 'sleepy', 'sleepy face', 'every emoji', '27'],
'????': ['sleep', 'sleepy', 'every emoji', '28'],
'????': ['truck', 'every emoji', '29'],
'????': ['money', 'money eyes', 'every emoji', '30'],
'????': ['shoked', 'every emoji', '31']
};
let emotions=Object.values(emojiDescriptions).filter((emo) => emo.find((word) => word.includes(content)));
return (
<div className='search-bar-container'>
<div className="title">
<BeakerIcon />
Emoji Search
</div>
<input type="text" className="search-bar" placeholder='Search for an emoji!' onChange={(e) => setContent(e.target.value)} value={content} />
<EmojiContainer emojis={emojiIcons} />
</div>
)
}
这是“EmojiContainer”组件的代码:
import React from 'react'
import './emojiContainer.scss';
export default function EmojiContainer(props) {
console.log(props.emojis)
let emojiList = props.emojis.map((emo,ind)=>
<li className='emoji' key={ind}>{emo}</li>
);
return (
<ul className='emoji-container'>
{emojiList}
</ul>
)
}
这是项目的链接,因此您可以浏览文件:https://github.com/Marouane328/Emoji-search-with-react/tree/master/emoji-search
感谢您的帮助!
【问题讨论】:
-
您正在通过推送来直接更改状态数组;你不应该那样做。
-
就像@ChrisG 提到的,你需要一个setter
const [emojiIcons] = useState([])。它应该是const [emojiIcons, setEmojiIcons] = useState([])和setEmojiIcons应该使用,而不是像你正在做的那样直接更改emojiIcons状态。 -
非常感谢您的帮助!
标签: javascript reactjs react-hooks react-component