Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 什么';呈现JSX的函数与在另一个组件中声明组件的函数之间的区别是什么?_Reactjs_React Hooks_Jsx_React Functional Component - Fatal编程技术网

Reactjs 什么';呈现JSX的函数与在另一个组件中声明组件的函数之间的区别是什么?

Reactjs 什么';呈现JSX的函数与在另一个组件中声明组件的函数之间的区别是什么?,reactjs,react-hooks,jsx,react-functional-component,Reactjs,React Hooks,Jsx,React Functional Component,这是反模式吗 export function Todo() { ... const renderItem = (item) => ( item.done ? <strike>{item.text}</strike> : <span>{item.text}</span> ); return ( <ul>

这是反模式吗

export function Todo() {
    ...

    const renderItem = (item) => (
        item.done
            ? <strike>{item.text}</strike>
            : <span>{item.text}</span>
    );

    return (
        <ul>
            {items.map((item) => <li>renderItems(item)</li>)}
        </ul>
    );
}
导出函数Todo(){
...
const renderItem=(项)=>(
项目完成
?{item.text}
:{item.text}
);
返回(
    {items.map((item)=>
  • renderItems(item)
  • )}
); }
这样呈现项与在Todo中创建项组件有什么区别,例如:

export function Todo() {
    ...

    const Item = (props) => (
        props.item.done
            ? <strike>{item.text}</strike>
            : <span>{item.text}</span>
    );

    return (
        <ul>
            {items.map((item) => <li><Item item={item} /></li>)}
        </ul>
    );
}
导出函数Todo(){
...
常量项目=(道具)=>(
道具。物品。完成
?{item.text}
:{item.text}
);
返回(
    {items.map((item)=>
  • )}
); }
编辑:

本地创建一次调用的组件/渲染函数怎么样

export function SomeForm(props) {
    const renderButton = (isComplete) => (
        isComplete
            ? <button>Submit</button>
            : <button disabled>Please complete</button>
    );

    return (
        <form>
            <input />
            {renderButton(props.isDone)}
        </form>
    );
}
导出函数某种形式(道具){
const renderButton=(isComplete)=>(
完成
提交
:请填写
);
返回(
{renderButton(props.isDone)}
);
}

让我们先将示例修复为有效代码:

// #1
export function Todo({items}) {
  const renderItem = (item) =>
    item.done ? <strike>{item.text}</strike> : <span>{item.text}</span>;

  return (
    <ul>
      {items.map((item) => (
        <li key={item.id}>{renderItems(item)}</li>
      ))}
    </ul>
  );
}

// #2
export function Todo({items}) {
  const Item = (props) =>
    props.item.done ? <strike>{item.text}</strike> : <span>{item.text}</span>;

  return (
    <ul>
      {items.map((item) => (
        <li key={item.id}>
          <Item item={item} />
        </li>
      ))}
    </ul>
  );
}

这样渲染项目有什么区别


renderItem
只是一个返回JSX的函数,
Item
是一个React组件,因此它的状态被注册到React树(“just a function”无法保持自己的状态)。

感谢您澄清了“just a function”和React组件之间的区别!我知道这在呈现排序列表时效率特别低,但是如果我只呈现一次什么呢。那么,创建“渲染”函数或本地组件仍然是一种反模式吗?我在编辑中添加了(一个相当做作的)示例。您的编辑都是相同的示例,仍然是反模式的
const renderItem = (item) => (...)
const Item = (props) => (...)

export function Todo({ items }) {
  return (
    <ul>
      {items.map((item) => (
        <li key={item.id}>
          (item.done ? <strike>{item.text}</strike>:<span>{item.text}</span>)
        </li>
      ))}
    </ul>
  );
}