BuilderIO / mitosis

Write components once, run everywhere. Compiles to React, Vue, Qwik, Solid, Angular, Svelte, and more.
https://mitosis.builder.io
MIT License
11.84k stars 512 forks source link

React's defaultProps will be remove from function components in a future release #1471

Open Th1nkK1D opened 3 weeks ago

Th1nkK1D commented 3 weeks ago

I am interested in helping provide a fix!

Yes

Which generators are impacted?

Reproduction case

https://mitosis.builder.io/playground/?code=JYWwDg9gTgLgBAbzgVwM4FMAi6BmBDZAGxgAUoIxU4BfOHckOAcgAEAjZYQgE3SgDpgEAPQhgMCKmComAbgBQ84ADsYffAGN0cMhSoJ5cOADc8hZOgD8ALjioYUFQHMF1RegAekWHF74i8DjIyhowQspwALIAngDCEOAQyuiqABRg5JS2upQAlIiGKBjY%2FsQ5qKkGRkam5ui2TAAW6ISEEEwANIXUuQqFUOgwyFARADzcwMYAfAgZevy1FtSjwhPTrkA

Expected Behaviour

Default props are defined with ES6 default parameters.

import * as React from "react";

interface Props {
  value?: string;
}

function MyComponent({ value: "hello" }: Props) {
  return <div>{value}</div>;
}

export default MyComponent;

PS. The playground doesn't not support TypeScript at the monent.

Actual Behaviour

Using defaultProps which will be removed in React 19.

import * as React from "react";

interface Props {
  value?: string;
}

function MyComponent(props: Props) {
  return <div>{props.value}</div>;
}

MyComponent.defaultProps = { value: "hello" };

export default MyComponent;

The error was also shown in the console.

image

Additional Information

defaultProps will be removed in place of ES6 default parameters in React 19 https://react.dev/blog/2024/04/25/react-19-upgrade-guide#removed-proptypes-and-defaultprops

manucorporat commented 2 weeks ago

Props destructuring might be a bit complicated to implement, in the meantime, i suggest to do:

import * as React from "react";

interface Props {
  value?: string;
}

function MyComponent(props Props) {
  props = {
    ...props,
    value: props.value ?? "hello",
  }
  return <div>{props.value}</div>;
}

export default MyComponent;

however, i agree the props destructuring way is better, beautiful and more idiomatic