Warm tip: This article is reproduced from serverfault.com, please click

javascript- React

(javascript - React)

发布于 2020-11-26 23:32:04

我正在学习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;
Questioner
RamPrakash
Viewed
22
Rico Kahler 2020-11-28 07:53:36

我担心的是-每当我从键盘上输入字符以输入文本框信息时,我都会看到名为“”的搜索帐户!!!在我的控制台输出中。如果我输入5个字符,我会看到5次-从根本上来说,这意味着整个组件都已重新呈现且方法已重新定义。

是的,这是预料之中的,并且与React的思维模型保持一致。

在React中,你会听到人们说“视图是状态的函数”,这意味着你在React状态下的变量内部的任何数据都应直接确定呈现的输出,有时称为“单向数据流”

但是,这样做的结果是,为了确定更改的内容,你需要渲染react组件。

这可以!

记住什么是React的力量-虚拟dom在内部,react创建了浏览器DOM的轻量级表示,因此上述单向数据流有效。


尽管你看到console.log输出的时间长短,但我在这里看到了另外一个问题

你正在做的事情在React中有一个“副作用”,每当你有副作用时,都应该使用useEffectuseEffect将确保你的副作用仅在你提供给其依赖项数组的值发生更改时才会运行。

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>

请参见此处了解更多关于如何useEffect工作,并在这里,如果你想深入了解