组件之外的 ReactJS 函数

Posted

技术标签:

【中文标题】组件之外的 ReactJS 函数【英文标题】:ReactJS functions outside of component 【发布时间】:2022-01-03 10:19:11 【问题描述】:

刚刚在 ReactJS 进行了一次面试,给了我一个奇怪的模板,其中一些函数(question1()、question2()、question3())在组件之外

我被要求打印名称并添加一个按钮以将新对象添加到数据中,然后屏幕将更新为新名称

1。 假设我只允许更改 question1()、question2() 的返回值。 question3(),是否可以将'setName'传递给question1()、question2()、question3()?

2。 把这些函数(question1(), question2(), question3())移到App组件里面是不是唯一的办法?

import React from "react";
import "./styles.css";

function question1() 
  return "---";

function question2() 
  return "---";

function question3() 
  return "---";


export default function App() 

const [name, setName] = useState();

  const data = [
    
      name: "Ruby",
      stars: 10,
      popularity: "90%"
    ,
    
      name: "Elliot",
      stars: 90,
      popularity: "100%"
    ,
    
      name: "Holly",
      stars: 55,
      popularity: "15%"
    ,
    
      name: "Jack",
      stars: 50,
      popularity: "1%"
    ,
    
      name: "",
      stars: 0,
      popularity: ""
    
  ];

  return (
    <div className="App">
      <h2>Code the answers below!</h2>
      <p>
        Question 1:
        <br />
      </p>
      question1(data)
      <br />
      <br />
      <p>
        Question 2:
        <br />
      </p>
      question2(data)
      <br />
      <br />
      <p>
        Question 3:
        <br />
      </p>
      question3(data)
      <br />
      <br />
      <p>
        Question 4:
        <br />
      </p>
      <button>Add another entry</button>
      <br />
      <br />
    </div>
  );

【问题讨论】:

这里的代码是他们给你的还是你完全修改过? 除了“const [name, setName] = useState()”,其他都给了。 他们是否解释了问题功能的目的是什么?目前,您被要求做的只是列出名称,并提供一个按钮,以及一些新功能以将新对象添加到数组中。 其实就是这样,没有多余的信息。他们将这些代码放在代码沙箱中,每个人都在 Teams 中看着我。所以,我想知道是否只允许更改那些函数的返回值(1、2、4) 【参考方案1】:

我不确定问题是什么。

你的意思是这样的吗?

function question1(setter, data) 
  setter(data[0].name);
  return data[0].name;

...
question1(setName, data)

这行不通,因为每次渲染时,它都会尝试调用question1(...),而setName(...) 会调用setName(...),从而导致渲染无限循环。这将被 react 捕获并且会中断。无论函数是在 App 函数范围内还是外部,都会发生这种情况。

将函数用作元素是不推荐/不好的做法,尤其是当函数触发导致重新渲染的钩子时。

编辑:

如果您的意思是函数question1(), 2, 3 正在返回一些静态数据并且没有调用任何触发重新渲染的异步钩子。然后,无论它是在 App 功能范围内还是之外,它都应该起作用。虽然还是建议放在里面,这样封装性更好。

【讨论】:

【参考方案2】:

我想我被问题模板分心了,这就是答案

import React, useState from "react";
import "./styles.css";

function question1(data) 
let result = '';
  
data.forEach((element, index, array) => 
    result += element.name;
  
  )

  return result;

function question2(data, setData) 

  setData(   [...data, 
    name: "Ruby",
    stars: 10,
    popularity: "90%"
  ]);
  return "---";




function question3() 
  return "---";


export default function App() 

  const [data, setData] = useState([
    
      name: "Ruby",
      stars: 10,
      popularity: "90%"
    ,
    
      name: "Elliot",
      stars: 90,
      popularity: "100%"
    ,
    
      name: "Holly",
      stars: 55,
      popularity: "15%"
    ,
    
      name: "Jack",
      stars: 50,
      popularity: "1%"
    ,
    
      name: "",
      stars: 0,
      popularity: ""
    
  ]);



  return (
    <div className="App">
      <h2>Code the answers below!</h2>
      <p>
        Question 1:
        <br />
      </p>
      

question1(data)
      
      <br />
      <br />
      <p>
        Question 2:
        <br />
      </p>
      
      <br />
      <br />
      <p>
        Question 3:
        <br />
      </p>
      question3(data)
      <br />
      <br />
      <p>
        Question 4:
        <br />
      </p>
      <button onClick=() => question2(data, setData) >Add another entry</button>
      <br />
      <br />
    </div>
  );

【讨论】:

您不应该像这样将setData 函数传递给问题函数。您还没有解释问题功能的用途。面试问题要求您做的只是列出名称,并添加一些功能以将新对象添加到数据中。为什么不使用表单来添加新的 obj? 所以,我想更好的方法是将这些函数(1、2、3)放在组件中,然后我不必像这样传递 setData ......正如我所说,我被模板分心了,想知道是否只允许更改函数(1、2、3)的返回值【参考方案3】:

我确信模板对某些东西很有用,但对您设定的要求没有用。分别是:

    列出数据数组中每个对象的名称 有一个向数组添加新对象的按钮

以下是我的处理方法。请注意,为方便起见,我将数据作为道具传递给组件,并且我添加了一个包含三个输入的表单,以便您可以添加所需的信息。

const  useState  = React;

function Example( input ) 

  // Set two states. The first holds the data.
  // The second holds an object that is updated
  // when the input values change
  const [ data, setData ] = useState(input);
  const [ newUser, setNewUser ] = useState();

  // If an input value changes update the
  // newUser object using the name and the value
  function handleChange(e) 
    const  name, value  = e.target;
    setNewUser( ...newUser, [name]: value );
  

  // When the button is clicked update
  // the data state with object stored in
  // the `newUser` state
  function handleClick() 
    const updated = [ ...data, newUser ];
    setData(updated);
  

  // `map` over the data and display each name
  return (
    <div>
      data.map(obj => 
        return <div>obj.name</div>;
      )
      <form onChange=handleChange>
        Name: <input type="text" name="name" value=newUser.name /><br />
        Stars: <input type="text" name="stars"  value=newUser.stars /><br />
        Popularity: <input type="text" name="popularity"  value=newUser.popularity /><br />
        <button type="button" onClick=handleClick>Add new person</button>
      </form>
    </div>
  );
;

const data=[name:"Ruby",stars:10,popularity:"90%",name:"Elliot",stars:90,popularity:"100%",name:"Holly",stars:55,popularity:"15%",name:"Jack",stars:50,popularity:"1%",name:"",stars:0,popularity:""];

ReactDOM.render(
  <Example input=data />,
  document.getElementById('react')
);
form, button  margin-top: 1em; 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<div id="react"></div>

【讨论】:

这是有道理的

以上是关于组件之外的 ReactJS 函数的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS + Material Design:如何在组件之外获取主题颜色?

从 ReactJS 外部渲染组件

在 ReactJS 的组件构造方法中获取上下文值的任何方法

Reactjs 触发 onClick 函数而不点击功能组件

Reactjs:如何在组件内创建带有 args 的函数

× 错误:无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用。[ReactJS]