React useEffect Hook when only one of the effect's deps changes, but not the others

后端 未结 6 654
小蘑菇
小蘑菇 2020-12-13 14:01

I have a functional component using Hooks:

function Component(props) {
  const [ items, setItems ] = useState([]);

  // In a callback Hook to prevent unnece         


        
6条回答
  •  暖寄归人
    2020-12-13 14:53

    I just tried this myself and it seems to me that you don't need to put things in the useEffect dependency list in order to have their updated versions. Meaning you can just solely put in props.itemId and still use items within the effect.

    I created a snippet here to attempt to prove/illustrate this. Let me know if something is wrong.

    const Child = React.memo(props => {
      const [items, setItems] = React.useState([]);
      const fetchItems = () => {
        setTimeout(() => {
          setItems((old) => {
            const newItems = [];
            for (let i = 0; i < old.length + 1; i++) {
              newItems.push(i);
            }
            return newItems;
          })
        }, 1000);
      }
      
      React.useEffect(() => {
        console.log('OLD (logs on both buttons) id:', props.id, 'items:', items.length);
      }, [props.id, items]);
      
      React.useEffect(() => {
        console.log('NEW (logs on only the red button) id:', props.id, 'items:', items.length);
      }, [props.id]);
    
      return (
        
    Click me to add a new item!
    ); }); const Example = () => { const [id, setId] = React.useState(0); const updateId = React.useCallback(() => { setId(old => old + 1); }, []); return (
    Click me to update the id
    ); }; ReactDOM.render(, document.getElementById("root"));
    
    
    
    

提交回复
热议问题