【问题标题】:Updating Parent Component State from Child Component with UseState React Hook使用 UseState React Hook 从子组件更新父组件状态
【发布时间】:2020-09-22 12:15:05
【问题描述】:

假设我有一个这样的父组件:

function Recipe(recipe) {
  const [pageState, updatePageState] = useState("view");

  return (
    <div className="border-b-2 border-gray-300 py-2">
      <div className="h-full flex-col md:flex md:flex-row md:justify-between md:items-start">
        <div
          className="order-2 flex flex-col flex-1 px-2 h-full md:h-72 lg:h-64 md:flex-col md:justify-between md:order-1 md:w-1/2 lg:w-3/4"
        >          
          <RecipeActions pageState = {pageState} triggerParentUpdate = {state => updatePageState(state)} />
        </div>
      </div>
    </div>
  )
}

我在下面有一个子组件,我正在尝试更新父组件中的pageState。我已经尝试了几次迭代,但都没有运气。

function RecipeActions(pageState, {triggerParentUpdate}){
  const [open, moreActions] = useState(false);

  function editRecipe(){
    triggerParentUpdate(pageState);
  }

  return(
    <div className="flex">
    <span className={`${pageState=='view' ? 'hidden' : ''} ml-1 sm:ml-2 md:ml-1 lg:ml-2 shadow-sm rounded-md`}>
      <button
        onClick={editRecipe}
        type="button"
        className="inline-flex items-center px-3 sm:px-4 py-2 border border-gray-300 text-sm leading-5 font-medium rounded-md text-gray-700 bg-white hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:text-gray-800 active:bg-gray-50 active:text-gray-800 transition duration-150 ease-in-out"
      >
        <svg className="h-5 w-5 text-gray-500" fill="currentColor" viewBox="0 0 20 20">
          <path d="M17.414 2.586a2 2 0 00-2.828 0L7 10.172V13h2.828l7.586-7.586a2 2 0 000-2.828z" />
          <path
            fillRule="evenodd"
            d="M2 6a2 2 0 012-2h4a1 1 0 010 2H4v10h10v-4a1 1 0 112 0v4a2 2 0 01-2 2H4a2 2 0 01-2-2V6z"
            clipRule="evenodd"
          />
        </svg>
        <p className="hidden sm:block sm:pl-2 md:hidden lg:block">Edit</p>
      </button>
    </span>
  </div>
  )
}

【问题讨论】:

    标签: reactjs components react-hooks


    【解决方案1】:

    我想通了。总结如下:

    重要的部分是确保您的道具作为单个数组传递给您的孩子,在调用您的函数时应该有一个函数(例如onClick={() =&gt; triggerParentUpdate('edit')}),以及将您的更新函数传递给孩子时家长,你需要这样的东西&lt;RecipeActions pageState = {pageState} triggerParentUpdate = {updatePageState} /&gt;

    父母

    function Recipe(recipe) {
      const [pageState, setPageState] = useState("view");
    
      const updatePageState = (state) => {
        setPageState(state);
      } 
    
      return (
        <div className="border-b-2 border-gray-300 py-2">
          <div className="h-full flex-col md:flex md:flex-row md:justify-between md:items-start">
            <div
              className="order-2 flex flex-col flex-1 px-2 h-full md:h-72 lg:h-64 md:flex-col md:justify-between md:order-1 md:w-1/2 lg:w-3/4"
            >          
              <RecipeActions pageState = {pageState} triggerParentUpdate = {updatePageState} />
            </div>
          </div>
        </div>
      )
    }
    

    孩子

    function RecipeActions({pageState, triggerParentUpdate}){
      const [open, moreActions] = useState(false);
    
      return(
        <div className="flex">
        <span className={`${pageState=='view' ? 'hidden' : ''} ml-1 sm:ml-2 md:ml-1 lg:ml-2 shadow-sm rounded-md`}>
          <button
            onClick={() => triggerParentUpdate('edit')}
            type="button"
            className="inline-flex items-center px-3 sm:px-4 py-2 border border-gray-300 text-sm leading-5 font-medium rounded-md text-gray-700 bg-white hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:text-gray-800 active:bg-gray-50 active:text-gray-800 transition duration-150 ease-in-out"
          >
            <svg className="h-5 w-5 text-gray-500" fill="currentColor" viewBox="0 0 20 20">
              <path d="M17.414 2.586a2 2 0 00-2.828 0L7 10.172V13h2.828l7.586-7.586a2 2 0 000-2.828z" />
              <path
                fillRule="evenodd"
                d="M2 6a2 2 0 012-2h4a1 1 0 010 2H4v10h10v-4a1 1 0 112 0v4a2 2 0 01-2 2H4a2 2 0 01-2-2V6z"
                clipRule="evenodd"
              />
            </svg>
            <p className="hidden sm:block sm:pl-2 md:hidden lg:block">Edit</p>
          </button>
        </span>
      </div>
      )
    }
    

    这是我在this page看到的另一个例子

    import React from 'react';
    
    function App() {
      const [fruits, setFruits] = React.useState([
        { id: '1', name: 'Apple', isFavorite: false },
        { id: '2', name: 'Peach', isFavorite: true },
        { id: '3', name: 'Strawberry', isFavorite: false },
      ]);
    
      function handleClick(item) {
        const newFruits = fruits.map((fruit) => {
          if (fruit.id === item.id) {
            return {
              id: fruit.id,
              name: fruit.name,
              isFavorite: !fruit.isFavorite,
            };
          } else {
            return fruit;
          }
        });
    
        setFruits(newFruits);
      }
    
      return (
        <div>
          <h3>with no styling</h3>
    
          <Basket items={fruits} onClick={handleClick} />
        </div>
      );
    }
    
    function Basket({ items, onClick }) {
      return (
        <ul>
          {items.map((item) => (
            <li key={item.id}>
              {item.name}
              <button type="button" onClick={() => onClick(item)}>
                {item.isFavorite ? 'Unlike' : 'Like'}
              </button>
            </li>
          ))}
        </ul>
      );
    }
    
    export default App;
    

    【讨论】:

    • 谢谢,这非常有用,我正在寻找这个!
    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 2020-05-31
    • 2018-10-09
    • 1970-01-01
    • 2021-04-02
    • 2018-07-20
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多