使用 useEffect() 钩子处理关键事件的正确方法是什么,另一方面会触发本地状态更改?

如何解决使用 useEffect() 钩子处理关键事件的正确方法是什么,另一方面会触发本地状态更改?

React Hooks 的新手,我遇到了这个问题。我有一个功能组件,当我按下回车键(keycode = 13)时,它接受输入并将其发送到父组件。组件看起来像这样。

SELECT CONCAT(id_prefix,id) as prefixed_id,...

问题是每次 const SearchTermBar = (props) => { const {resetStateSearchTerm,handlePowerToggleParent} = props; const [inputTerm,handleInputChange] = useState(''); const inputRef = useRef(); useEffect(() => { const keyPressEvent = (e) => { if (e.keyCode === 13) { resetStateSearchTerm(inputTerm); handleInputChange(''); handlePowerToggleParent('search'); } }; inputRef.current.addEventListener('keydown',keyPressEvent); let parentInputRef = inputRef; return () => { console.log('remove event listener'); parentInputRef.current.removeEventListener('keydown',keyPressEvent); } },[inputTerm,resetStateSearchTerm,handlePowerToggleParent]); return ( <div className='SearchTermBar'> <input type='text' placeholder='Enter search term here (Press return to confirm)' className='SearchTermBar__Input' value={inputTerm} onChange={(e) => handleInputChange(e.target.value)} ref={inputRef} /> </div> ); inputTerm 值更改时都会注册和取消注册事件。但我无法找出处理事件注册/删除的正确方法(理想情况下应该发生一次)我知道这是因为对 props 的依赖,但我想知道更好的解决方案这个问题。

解决方法

你已经有了输入引用,你真的不需要状态:

    function create_mpg_aes_encrypt($parameter = "",$key = "",$iv = ""){
    $return_str = '';
    if(!empty($parameter)) {
       
        // URL ENCODED QUERY STRING
       $return_str = http_build_query($parameter);
       //echo $return_str;
    }
    
    return trim(bin2hex(openssl_encrypt(addpadding($return_str),'aes-256-cbc',$key,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$iv)));
}
function addpadding($string,$blocksize = 32) {
    $len = strlen($string);
    $pad = $blocksize - ($len % $blocksize);
    $string .= str_repeat(chr($pad),$pad);
    return $string;
}

$trade_info_arr = array( 
    'MerchantID' => 3430112,'RespondType' => 'JSON','TimeStamp' => 1485232229,'Version' => 1.4,'MerchantOrderNo' => 'S_1485232229','Amt' => 40,'ItemDesc' => 'UnitTest' 
);  

$mer_key ='12345678901234567890123456789012';
$mer_iv = '1234567890123456'; 

// Result I expected to get
/*ff91c8aa01379e4de621a44e5f11f72e4d25bdb1a18242db6cef9ef07d80b0165e476fd1d9acaa53170272c82d122961e1a0700a7427cfa1cf90db7f6d6593bbc93102a4d4b9b66d9974c13c31a7ab4bba1d4e0790f0cbbbd7ad64c6d3c8012a601ceaa808bff70f94a8efa5a4f984b9d41304ffd879612177c622f75f4214fa*/

无论哪种方式,如果你想保持状态,它的值应该被复制到一个 ref 中以修复 const NOP = () => {}; const DEFAULT_INPUT = ""; function SearchTermBar(props) { const { resetStateSearchTerm = NOP,handlePowerToggleParent = NOP } = props; const inputRef = useRef(); useEffect(() => { const keyPressEvent = (e) => { if (e.keyCode === 13) { resetStateSearchTerm(inputRef.current.value); inputRef.current.value = DEFAULT_INPUT; handlePowerToggleParent("search"); } }; inputRef.current.addEventListener("keydown",keyPressEvent); let parentInputRef = inputRef; return () => { console.log("remove event listener"); parentInputRef.current.removeEventListener("keydown",keyPressEvent); }; },[resetStateSearchTerm,handlePowerToggleParent]); return ( <input type="text" placeholder="Enter search term here (Press return to confirm)" style={{ width: "50%" }} ref={inputRef} /> ); } 中的闭包。可以通过添加另一个 useEffect 来更新提到的引用。

Edit hardcore-gates-iyffi

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?