我们有一个 SPA,我们正在从 CRA 迁移到 next.js。到目前为止,大多数事情都很顺利。我们需要构建一个自动完成搜索栏,因此我们从 MUI v5 开始Autocomplete
,它在开发中完美运行,但是当我们将其部署为静态 html/css 时,生产中提供的应用程序不会显示搜索结果。
最初的假设是它是 MUI v5 的怪癖,所以我们切换到使用 Paper 降档以显示自动完成结果,但不幸的是,我们仍然遇到相同的问题,即没有渲染,但只是在部署中。在本地,一切都完美无缺
这是组件在降档时的外观:
type Property = {
address?: string;
propertyId?: string;
};
const Dropdown: FC = () => {
const [address, setAddress] = useState<string | null>(null); // search term
const { propertyList: property } = useSearchbar(address);
const history = useHistory();
const handleStateChange = (changes: any): void => {
if (Object.prototype.hasOwnProperty.call(changes, 'selectedItem')) {
setAddress(changes.selectedItem);
} else if (Object.prototype.hasOwnProperty.call(changes, 'inputValue')) {
setAddress(changes.inputValue);
}
};
const label = (): JSX.Element => {
return (
<Box sx={{ display: 'flex' }}>
<SearchIcon sx={{ color: '#000000' }} />
<Typography sx={{ color: ' #0000009C', fontStyle: 'italic', ml: 2 }}>
Enter Any NYC Address
</Typography>
</Box>
);
};
const handleOnSelect = (selectedItem: any): void => {
if (selectedItem?.propertyId) {
history.push(`/bldgs/${selectedItem?.propertyId}`);
}
};
return (
<Downshift
onStateChange={handleStateChange}
onSelect={handleOnSelect}
itemToString={(item) => (item ? item.address : '')}
>
{({
getInputProps,
getMenuProps,
getItemProps,
clearSelection,
getToggleButtonProps,
isOpen,
highlightedIndex
}) => (
<div>
<Box sx={{ display: 'flex' }}>
<TextField
sx={{ width: '95%', ml: 2, mr: 2, mt: 1, mb: 1 }}
variant="filled"
label={label()}
inputProps={getInputProps({
placeholder: 'Search'
})}
InputProps={{
sx: {
background: '#FFFFFF'
},
disableUnderline: true
}}
/>
<Box sx={{ mt: 3, mr: 2 }}>
{isOpen && (
<button {...getToggleButtonProps()} onClick={clearSelection}>
<svg
viewBox="0 0 20 20"
preserveAspectRatio="none"
width={12}
fill="transparent"
stroke="#979797"
strokeWidth="1.1px"
>
<path d="M1,1 L19,19" />
<path d="M19,1 L1,19" />
</svg>
</button>
)}
</Box>
</Box>
{isOpen && property.length > 0 && (
<Paper>
<List
{...getMenuProps()}
sx={{
width: { xs: 300, sm: 500, md: 850, lg: 500 }
}}
>
{property.map((item: Property, index) => (
<ListItemButton
key={`${item.propertyId}-${index}`}
{...getItemProps({
style: {
backgroundColor:
index === highlightedIndex ? 'lightgray' : 'white'
},
item,
index
})}
>
<ListItemText primary={item.address} />
</ListItemButton>
))}
</List>
</Paper>
)}
</div>
)}
</Downshift>
);
};
export default Dropdown;
nextjs 导出生成的静态文件由运行在 k8s 集群中的 nodejs 服务器提供服务。
关于可能发生的事情有什么想法吗?