Let's see pros/cons for each option, given the component User:
const User = ({name,lastName}) => <>...</>
Destructing props:
const props = {
  name: 'Jhon',
  lastName: 'Cena'
};
<User {...props}/>
Pros
Cons
- Keys must match properties
- Error-prone, might get unexpected behavior when there are keys that supposedly aren't used by the component
- No auto-complete & auto-suggestion
const props = {
  name: 'Jhon',
  lastName: 'Cena',
  id: 325013213
};
// User component might be updated in future releases and might use id unexpectedly.
<User {...props}/>
Passing named props
const props = {
  user: 'Jhon',
  lastName: 'Cena'
};
<User name={user} lastName={lastName}/>
Pros
- Auto-complete & auto-suggestion
- Values don't have to match the prop name (like name={user})
- Maintainable
Cons
- Long syntax
- Not readable on many props
- Repeatable (className={className})
Destructing named props
const props = {
  name: 'Jhon',
  lastName: 'Cena'
};
<User {...{ name,lastName }}/>
Props
- Auto-complete & auto-suggestion
- Maintainable
- Readable
Cons
On my codebase, I'm trying to combine:
const props = {
  className: 'user',
  user: 'Jhon',
  lastName: 'Cena'
};
<User {...{className,lastName} name={user}/>
// Although you totally can write like this,
// I find it confusing
<User {...{className, name:user,lastName}/>