【发布时间】:2020-09-22 23:00:24
【问题描述】:
我在看一些关于 React Hooks 的教程,在教程中作者创建了一个 useDropdown 钩子来呈现可重用的下拉菜单。代码是这样的
import React, { useState } from "react";
const useDropdown = (label, defaultState, options) => {
const [state, updateState] = useState(defaultState);
const id = `use-dropdown-${label.replace(" ", "").toLowerCase()}`;
const Dropdown = () => (
<label htmlFor={id}>
{label}
<select
id={id}
value={state}
onChange={e => updateState(e.target.value)}
onBlur={e => updateState(e.target.value)}
disabled={!options.length}
>
<option />
{options.map(item => (
<option key={item} value={item}>
{item}
</option>
))}
</select>
</label>
);
return [state, Dropdown, updateState];
};
export default useDropdown;
他在这样的组件中使用了它
import React, { useState, useEffect } from "react";
import useDropdown from "./useDropdown";
const SomeComponent = () => {
const [animal, AnimalDropdown] = useDropdown("Animal", "dog", ANIMALS);
const [breed, BreedDropdown, updateBreed] = useDropdown("Breed", "", breeds);
return (
<div className="search-params">
<form>
<label htmlFor="location">
Location
<input
id="location"
value={location}
placeholder="Location"
onChange={e => updateLocation(e.target.value)}
/>
</label>
<AnimalDropdown />
<BreedDropdown />
<button>Submit</button>
</form>
</div>
);
};
export default SomeComponent;
他说这样我们可以创建可重用的下拉组件。我想知道这与定义一个普通的旧 Dropdown 组件并将道具传递给它有什么不同。在这种情况下我能想到的唯一区别是现在我们能够在父组件中获取状态和 setState(即SomeComponent)并读取/设置子组件的状态(即@987654325 输出的组件@) 直接从那里。然而,这是否被认为是一种反模式,因为我们正在打破单向数据流?
【问题讨论】:
-
我会投票反对反模式。首先,它只能在功能组件中重用,其次,正如您所指出的,它打破了“常规”组件抽象,将 props 传递给子组件。
-
反模式似乎是目前最受欢迎的流行词。它本身不是一个反模式,因为它不遵循任何类型的模式,它只是一个令人困惑的解决方案。这与提倡或至少提出的设计不同,这会导致糟糕/糟糕的解决方案。此外,函数式组件是解决问题的一种合法方式,并且源于良好的老式函数式编程,这通常比基于类的架构更易于阅读和处理。
标签: javascript reactjs react-hooks