问题描述
我一直在努力寻找一种方法来制作可靠的可重复使用的SearchBar组件。我试图为此制作一个组件。但是,此组件无法保持其自己的状态。这意味着您将有两次导入才能使用此搜索栏。像这样:
import React,{ useState } from 'react';
import SearchBar from './SearchBar';
const Parent = () => {
const [value,setValue] = useState("");
return (
<div>
<SearchBar ...use 'value' and 'setValue' somehow... blah blah... />
{list.map((item) => ...render item if it matches 'value'...)}
</div>
}
那很容易,但是我的脑袋就走了……我在互联网上发现了一个“ useInput”自定义钩子,该钩子使用传播语法将一些道具传递给“ input”标签……我决定看看有多远我可以接受这个。
事实证明,我们在项目中使用JSS,这是事情变得有些荒谬的时候。这是我的挂钩:
import { useState } from 'react';
import { createUseStyles } from 'react-jss';
// My gut tells my this is a really terrible thing to do!
export const useSearchBar = () => {
const [value,setValue] = useState('');
const classes = useStyles();
return {
value,setValue,reset: () => setValue(""),bindSearchBar: {
type: 'text',className: classes.searchBar,placeholder: 'Search',value,onChange: (event: {target: {value: string}}) => {
setValue(event.target.value);
}
}
};
};
const useStyles = createUseStyles({
searchBar: {
...search bar styles...
},});
最简单的实现如下:
import React form 'react';
import { useSearchBar } from '../hooks/useSearchBar';
const Component = () => {
const { bindSearchBar,value } = useSearchBar();
return <input {...bindSearchBar} />;
}
我需要一个列表,但我想你明白了。我有一种奇怪的感觉,我认为这有一个严重的错误。我敢肯定,现在我会爱上它,但是在6个月后,我会讨厌自己。谁能告诉我这里可能出什么问题或为什么这可能是不好的做法?还是您认为以这种方式使用钩子是可行的?
解决方法
在一个钩子中创建jss类没有错。 useStyles是一个挂钩,自定义挂钩的属性是在其中使用其他挂钩。
除此之外,这是一个性能提示。
def translate(phrase):
translation = ""
for letter in phrase:
if letter.lower() in "aeiouy":
if letter.upper():
translation = translation + "G"
else:
translation = translation + "g"
else:
translation = translation + letter
return translation
print(translate(input("Enter A Phrase to Translate: ")))