首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用onChange更新组件。React-Hooks

使用onChange更新组件。React-Hooks
EN

Stack Overflow用户
提问于 2019-12-07 21:02:54
回答 1查看 13.3K关注 0票数 1

我正在构建一个下拉列表,其中包含从API获取数据的建议。来自搜索栏的输入是使用setState存储的,当我更改文本输入中的值时,它就会更新。

问题是,每次在文本输入中输入新字符时,我都无法从下拉列表中更新用户列表。我能以某种方式在每次道具改变时强制渲染组件吗?还是有更好的方法?

代码语言:javascript
复制
import React, {useState, useEffect} from 'react';
import Dropdown from '../Dropdown/Dropdown';
import './SearchBar.css';


// Component created with arrow function making use of hooks
const SearchBar = (props) => {

    const [input, setInput] = useState('');
    const [dropdownComponent, updateDropdown] = useState(<Dropdown input={input}/>)

    useEffect(() => {updateDropdown(<Dropdown input={input}/>)}, [input])

    const onChange = (e) => {
        setInput(e.currentTarget.value)
        updateDropdown(<Dropdown input={input}/>)
        console.log("=(")
    }



    return(
        <div className="search-bar">
            <input type="text" placeholder={props.placeholder} onChange={onChange}/>
            {dropdownComponent}
        </div>

    )
}

export default SearchBar;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 21:07:50

我不能在一个简单的测试中使用您的代码来解决这个问题,但是您的onChange确实有一个问题:它使用input来更新dropdown,但是它没有使用useCallback来确保input在更新时不会过时。以下任一项:

  1. 不要更新onChange中的dropdown,让useEffect回调来完成;或者
  2. 使用e.target.value而不是input,并去掉更新dropdown的useEffect;或者
  3. 不要对dropdown进行记忆(例如,不要将其置于状态),因为您希望在输入发生更改时对其进行更新,只需直接在JSX中呈现它

根据您所展示的,其中#3可能是最简单的:

代码语言:javascript
复制
const SearchBar = (props) => {

    const [input, setInput] = useState('');

    const onChange = (e) => {
        setInput(e.currentTarget.value);
    };

    return(
        <div className="search-bar">
            <input type="text" placeholder={props.placeholder} onChange={onChange}/>
            <Dropdown input={input}/>
        </div>
    );
}

现场示例:

代码语言:javascript
复制
const {useState, useEffect} = React;

function Dropdown({input}) {
    return <div>Dropdown for "{input}"</div>;
}

const SearchBar = (props) => {

    const [input, setInput] = useState('');

    const onChange = (e) => {
        setInput(e.currentTarget.value);
    };

    return(
        <div className="search-bar">
            <input type="text" placeholder={props.placeholder} onChange={onChange}/>
            <Dropdown input={input}/>
        </div>
    );
}

ReactDOM.render(<SearchBar />, document.getElementById("root"));
代码语言:javascript
复制
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.10.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.10.2/umd/react-dom.production.min.js"></script>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59226253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档