React:React 组件的 props 数量是否有可观的限制

React: Are there respectable limits to number of props on react components

有时我的组件具有大量属性。

这有什么固有问题吗?

例如

render() {

  const { create, update, categories, locations, sectors, workTypes, organisation } = this.props; // eslint-disable-line no-shadow

  return (
    <div className="job-container">
      <JobForm
        organisationId={organisation.id}
        userId={user.id}
        action={action}
        create={create}
        update={update}
        categories={categories}
        locations={locations}
        sectors={sectors}
        workTypes={workTypes}
      />
    </div>
  );
} 

最佳做法是什么?

除了冗长之外,它没有任何问题,但当然,这会使您的组件从根本上更难维护。

使它更通用的一种常见方法是改用扩展运算符,用 shorthand 传递所有这些道具。

<JobForm {...this.props} />

解决该问题的另一种方法是通过将组件拆分为更小、更集中的组件来分担组件的责任,这些组件可以改为组合。

我认为您刚刚发现了代码味道。任何时候你有那么多输入(道具)到一个函数(组件),你必须质疑,你如何用参数组合的所有排列来测试这个组件。使用 {...this.props} 传递它们只会减少打字,有点像在腐烂的尸体上喷洒 Febreeze。

我想问一下,为什么您同时拥有 createupdate 方法,而不是提交方法?

您如何使用 organisationIduserId?如果只需要将这些传递给也传递进来的 createupdate(或 submit)方法,为什么不传递它们并让 onCreate/ onUpdate 处理程序提供它们?

也许 JobForm 应该呈现为:

<JobForm /* props go here */>
   <CategoryDroplist categories=this.props.categories />
   <LocationDroplist locations=this.props.locations />
</JobForm>

JobForm 中你有 props.children 但这些是单独的组件,作为单独的组件可能没问题。

我只是没有足够的信息来回答这个问题,但是通过将你的组件分解成更简单的东西,道具的数量会减少,气味也会减少。

多年来,许多语言的风格指南都建议限制函数的参数数量。甚至 ESLint 也有关于此的规则并声明:“......可能难以读写,因为它需要记住每个参数是什么,它的类型以及它们应该出现的顺序。”。

我认为在 JSX 中也是如此。由于 JSX 是 JS 的 DSL,我们正在编译代码味道,有点。

不,在一个组件中使用 props 没有各自的限制,但我在一个组件中使用了 12 个 props

App.js component

import Map from './Map';

const arr = [1,2,3,4,5];
const arr1 = [1,2,3,4,5];
const arr2 = [1,2,3,4,5];
const arr3 = [1,2,3,4,5];
const arr4 = [1,2,3,4,5];
const arr5 = [1,2,3,4,5];
const arr6 = [1,2,3,4,5];
const arr7 = [1,2,3,4,5];
const arr8 = [1,2,3,4,5];
const arr9 = [1,2,3,4,5];
const arr10 = [1,2,3,4,5];
const arr11 = [1,2,3,4,5];
const arr12 = [1,2,3,4,5];
const arrAlpha = ['A','B','C','D'];

const App = () => {
  return (
    <>
     <h1>App page</h1>
     <Map 
      alpha = {arrAlpha} 
      numb={arr} 
      beta={arr1}
      gamma={arr2}
      delta={arr3}
      sigma={arr4}
      theta={arr5}
      sin={arr6}
      cos={arr7}
      sec={arr8}
      cosec={arr9}
      tan={arr10}
      cot={arr11}
      tri={arr12}
    />
    </>
  )
}

export default App

Map.js Component

const Map = (props) => {

const one = props.alpha;
let itemOne = one.map((items)=><li>{items}</li>) 

const two = props.numb;
let itemTwo = two.map((itemst)=><li>{itemst}</li>)

const three = props.beta;
let itemThree = three.map((beta)=><li>{beta}</li>)

const four = props.gamma;
let itemfour = four.map((gamma)=><li>{gamma}</li>)

const five = props.delta;
let itemfive = five.map((delta)=><li>{delta}</li>)

const six = props.sigma;
let itemSix = six.map((sigma)=><li>{sigma}</li>)

const seven = props.theta;
let itemSeven = seven.map((theta)=><li>{theta}</li>)

const eight = props.sin;
let itemEight = eight.map((sin)=><li>{sin}</li>)

const nine = props.cos;
let itemNine = nine.map((cos)=><li>{cos}</li>)

const ten = props.sec;
let itemTen = ten.map((sec)=><li>{sec}</li>)

const eleven = props.cosec;
let itemEleven = eleven.map((cosec)=><li>{cosec}</li>)

const twelve = props.tan;
let itemTwelve = twelve.map((tan)=><li>{tan}</li>)


return (
        <>
            <h1>React Map Items</h1>
            <ul>
                <li>{itemOne}</li>
                <li>{itemTwo}</li>
                <li>{itemThree}</li>
                <li>{itemfour}</li>
                <li>{itemfive}</li>
                <li>{itemSix}</li>
                <li>{itemSeven}</li>
                <li>{itemEight}</li>
                <li>{itemNine}</li>
                <li>{itemTen}</li>
                <li>{itemEleven}</li>
                <li>{itemTwelve}</li>    
            </ul>
            
        </>
    )
}

导出默认地图