当前位置: 首页 > 知识库问答 >
问题:

如何在react.js?中导出钩子到其他函数

林承悦
2023-03-14

我正在尝试将钩子{count,setCount}=useState(0)导出到另一个函数,以便能够获取{count}值。我的应用程序是通过添加项目来制作一个简单的清单,然后当按下提交按钮时,获取该清单的渲染。

import React, { useState } from "react";
import objects from "../list";

const List = function _List(item) {
  const [count, setCount] = useState(0);
  const increase = () => {
    return count < 10 ? setCount(count + 1) : 10;
  };
  const decrease = () => {
    return count > 0 ? setCount(count - 1) : 0;
  };
  return (
    <div className="flex">
      <h3>{item.name}</h3>
      <button type="submit" onClick={decrease}>
        -
      </button>
      <h3>{count}</h3>
      <button type="submit" onClick={increase}>
        +
      </button>
    </div>
  );};

function App() {
  const [message, setMessage] = useState("No Order Submited");

  function displayOrder() {
    const orderList = setMessage(objects.map((x) => `${x.name} `));
    // Would like to export {count} in const orderList
    return { orderList };
  }

  return (
    <div>
      <fieldset>
        <h1>Items:</h1>
        {objects.map(List)}
      </fieldset>
      <button type="submit" onClick={displayOrder}>
        Submit
      </button>
      <h2>{message}</h2>
    </div>
  );
}
export default App;

以下是我的库存对象列表:

const objects = [
  {
    id: 1,
    name: "item1",
  },
  {
    id: 2,
    name: "item2",
  }
];
export default objects;

最好的方法是将我的钩子移动到应用程序函数中,但是增加或减少{计数}会影响我的所有项目。

在运行函数displayOrder时,是否仍要为每个项呈现{count}?

谢谢

共有1个答案

汪丁雷
2023-03-14

您可能想要的主要方法是将状态移动到父组件。所以像这样的事情:

const {useState} = React;
const exampleObjects = [
  {id: 1, name: "item1"},
  {id: 2, name: "item2"}
];

// It makes react devs happy when you avoid mutating state.
const update = (arr, i, newVal) => [
  ...arr.slice(0,i), newVal, ...arr.slice(i+1)
];

function List({name, count, setCount}) {
  const increase = () => {
    return count < 10 ? setCount(count + 1) : 10;
  };
  const decrease = () => {
    return count > 0 ? setCount(count - 1) : 0;
  };

  return (
    <div className="flex">
      <h3>{name}</h3>
      <button type="submit" onClick={decrease}>
        -
      </button>
      <h3>{count}</h3>
      <button type="submit" onClick={increase}>
        +
      </button>
    </div>
  );
}

function App({objects}) {
  // I would actually recommend you make counts an object, but I figured I'd leave the .reduce fun as an exercise for you.
  // Note this also gets rid of the update function silliness, allowing you to do something like {...oldObj, [id]: newVal} instead. 
  const [counts, setCounts] = useState(objects.map(_ => 0));
  const [order, setOrder] = useState(null);

  const setCount = (i) => (newVal) => {
    setCounts(cs => update(cs,i,newVal));
  };

  const submitOrder = () => {
    setOrder(objects.map((o,i) => ({...o, count: counts[i]})));
  };

  return (
    <div>
      <fieldset>
        <h1>Items:</h1>
        {objects.map((o, i) => (<List key={o.id} {...o} count={counts[i]} setCount={setCount(i)} />))}
      </fieldset>
      <button type="submit" onClick={submitOrder}>
        Submit
      </button>
      <h2>Orders</h2>
      {!order ? "No order submitted" : order.map(({id, name, count}) => (
          <div key={id}> {name}: {count} </div>
      ))}
    </div>
  );
}


// Render it
ReactDOM.render(
  <App objects={exampleObjects} />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>
 类似资料:
  • 所以我创建了一个电影数据库应用程序,我想在不同的类别之间切换,如,等。我试图通过将状态设置为任何点击的文本值,稍后将用于形成完整的网址来获取。 这是我的代码: 所以我想从在函数外部,并在此处使用它

  • 本文向大家介绍在React.js中使用useState钩子,包括了在React.js中使用useState钩子的使用技巧和注意事项,需要的朋友参考一下 钩子允许功能组件在反应中获得基于类的组件中可用的特性,从而使它们更加强大。 useState,我们将从react导入。从'react'导入{useState}; 这有助于我们为功能组件创建局部状态变量,并提供更新该变量的方法。 类中的状态是一个对象

  • 问题内容: 我在一个项目中有一些代码,想在另一个项目中重用。我需要做什么(在两个文件夹中)才能执行此操作? 目录结构类似于: oo 项目1 file1.py file2.py 酒吧 项目2 fileX.py fileY.py 我想使用fileX.py和fileY.py中的file1.py和file2.py中的函数。 问题答案: 理想情况下,两个项目都是可安装的python程序包,并充满__init

  • 问题内容: 我已经在工作,但是当我尝试从其他模块调用它时,是否会不确定? app.js Consumer.js 问题答案: 由于app.js通常是应用程序中的主要初始化模块,因此通常会同时初始化Web服务器和socket.io并加载应用程序所需的其他内容。 因此,与其他模块共享的一种典型方法是将它们传递给该模块的构造函数中的其他模块。那会像这样工作: 然后,在consumer.js中: 或者,如果

  • 这是react项目中的bootcamp.js文件 console.log(训练营)显示未定义。Plzz帮助

  • 我制作了我的python模块,它<code>A。py使用如下所示。在这种情况下,如何导入<code>B。py在?我想使用其他目录中的模块。但由于路径问题,我的代码无法工作。 A.py 碧桂园 main _ in _ mylib.py 主.py ModuleNotFoundError:没有名为“B”的模块 ModuleNotFoundError:没有名为“B”的模块