我正在学习ReactJS。我想使用功能组件。在我的组件中,我有一个文本框和一个清除按钮。
我担心的是-每当我从键盘上输入字符以输入文本框的信息时,我都会search account called!!!
在控制台输出中看到。如果我输入5个字符,我会看到5次-从根本上来说,这意味着整个组件都已重新呈现且方法已重新定义。
这不是不好的做法,并且会影响性能吗?还有其他选择吗?
import React, { useState, useContext } from 'react';
import AccountContext from . './accountContext'
const SearchAccounts = () => {
const [text, setText] = useState('');
const onChange = (evt) => setText(evt.target.value);
console.log('search account called!!!');
// some methods are defined here
onSubmit = () => {...}
onClear = () => {...}
return (
<div>
<form onSubmit={onSubmit} className="form">
<input
type="text"
name="text"
value={text}
onChange={onChange}
placeholder="Search Accounts..."
/>
<input type="submit" value="Search" className="...." />
</form>
<button
className="...."
onClick={onClear}
style={getClearStyle()}
>Clear</button>
</div>
);
}
export default SearchAccounts;
我担心的是-每当我从键盘上输入字符以输入文本框信息时,我都会看到名为“”的搜索帐户!!!在我的控制台输出中。如果我输入5个字符,我会看到5次-从根本上来说,这意味着整个组件都已重新呈现且方法已重新定义。
是的,这是预料之中的,并且与React的思维模型保持一致。
在React中,你会听到人们说“视图是状态的函数”,这意味着你在React状态下的变量内部的任何数据都应直接确定呈现的输出,有时称为“单向数据流”
但是,这样做的结果是,为了确定更改的内容,你需要渲染react组件。
这可以!
记住什么是React的力量-虚拟dom。在内部,react创建了浏览器DOM的轻量级表示,因此上述单向数据流有效。
尽管你看到console.log
输出的时间长短,但我在这里看到了另外一个问题。
你正在做的事情在React中有一个“副作用”,每当你有副作用时,都应该使用useEffect
。useEffect
将确保你的副作用仅在你提供给其依赖项数组的值发生更改时才会运行。
const { useEffect, useState } = React;
const { render } = ReactDOM
function MyComponent() {
const [value, setValue] = useState('world');
useEffect(() => {
console.log('this should only render once');
}, []);
useEffect(() => {
console.log(`this will render on every value change: the value: ${value}`);
}, [value])
return (
<label>
hello, <input value={value} onChange={e => setValue(e.target.value)} />
</label>
);
}
render(<MyComponent />, document.querySelector('#root'));
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>