react-hooks 官方文档笔记

1、useState 

import { useState } from 'react';

function Example () {

  const  [count, setCount] = useState(0);

  return (<div>

      <span>{count}</span>

      <button onClick={ () => { setCount(count+1) } }>增加次数</button>

  </div>);

}


 

2、useEffect 

Effects without cleanup 

import { useEffect } from 'react;

useEffect(() => {

  document.title = 'try to underStand what is effects';

});

What does useEffect do?

By using this Hook, you tell React that your component needs to do something after render.

React will remember the function you passed (we’ll refer to it as our “effect”), and call it later after performing the DOM updates.

In this effect, we set the document title, but we could also perform data fetching or call some other imperative API.

// Data fetching, setting up a subscription, and manually changing the DOM in React components are all examples of side effects.

// useEffect is similar to componentDidMount and componentDidUpdate

 

Why is useEffect called inside a component? 

Placing useEffect inside the component lets us access the count state variable (or any props) right from the effect.

We don’t need a special API to read it — it’s already in the function scope.

Hooks embrace JavaScript closures and avoid introducing React-specific APIs where JavaScript already provides a solution.

 

Does useEffect run after every render? 

Yes!By default, it runs both after the first render andafter every update.

Instead of thinking in terms of “mounting” and “updating”,

you might find it easier to think that effects happen “after render”.

React guarantees the DOM has been updated by the time it runs the effects.

 

Experienced JavaScript developers might notice thatthe function passed to useEffect is going to be different on every render.

This is intentional. In fact, this is what lets us read the count value from inside the effect without worrying about it getting stale.

Every time we re-render, we schedule a different effect, replacing the previous one.

In a way, this makes the effects behave more like a part of the render result — each effect “belongs” to a particular render. 

 

Effects with cleanup 

In a React class, you would typically set up a subscription in componentDidMount, and clean it up in componentWillUnmount

Notice how componentDidMount and componentWillUnmount need to mirror each other.

Lifecycle methods force us to split this logic even though conceptually code in both of them is related to the same effect.

 

useEffect(() => {

  function setFriendStatus (status) {

  }

  chatApi.subscibeToFriendStatus(id,setFriendStatus);

  return function cleanUp () {

    chatApi.unSubscibeFromFriendStatus(id,setFriendStatus);

  } // We don’t have to return a named function from the effect. We called it cleanup here to clarify its purpose, but you could return an arrow function or call it something different.

 });

You might be thinking that we’d need a separate effect to perform the cleanup.

But code for adding and removing a subscription is so tightly related that useEffect is designed to keep it together.

If your effect returns a function, React will run it when it is time to clean up:

 

Why did we return a function from our effect? 

This is the optional cleanup mechanism for effects.

Every effect may return a function that cleans up after it.

This lets us keep the logic for adding and removing subscriptions close to each other.

They’re part of the same effect!

 

When exactly does React clean up an effect? 

React performs the cleanup when the component unmounts.

However, as we learned earlier, effects run for every render and not just once.

This is why React also cleans up effects from the previous render before running the effects next time. 

 

Tip: Optimizing Performance by Skipping Effects

useEffect(() => { document.title = `You clicked ${count} times`; }, [count]); // Only re-run the effect if count changes


 

3、Rules of Hooks

Only Call Hooks at the Top Level

Don’t call Hooks inside loops, conditions, or nested functions.

 Instead, always use Hooks at the top level of your React function.

By following this rule, you ensure that Hooks are called in the same order each time a component renders.

That’s what allows React to correctly preserve the state of Hooks between multiple useState and useEffect calls.  

 

Only Call Hooks from React Functions

Don’t call Hooks from regular JavaScript functions. Instead, you can:

  • ✅ Call Hooks from React function components.
  • ✅ Call Hooks from custom Hooks 

 

posted @ 2019-04-26 18:29  真希  阅读(438)  评论(0编辑  收藏  举报