solid js - Typescript+SolidJS: hur kan jag utöka props för någon JSX-element?
Hur kan jag i SolidJS utöka props för ett befintligt JSX-element och skapa mitt egna gränssnitt som detta ButtonProps-gränssnitt i exemplet nedan för React.
import React from 'react';
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
title: string;
showIcon: boolean;
}
const Button: React.FC<ButtonProps> = ({ title, showIcon, ...props }) => {
return (
<button {...props}>
{title}
{showIcon && <Icon/>}
</button>
);
};
Svar #1
Så här brukar jag göra det:
import type { Component, JSX } from "solid-js";
import { splitProps } from "solid-js";
export type ButtonProps = {
title: string;
showIcon: boolean;
} & JSX.HTMLAttributes<HTMLButtonElement>;
const Button: Component<ButtonProps> = (props) => {
const [, rest] = splitProps(props, ["title", "showIcon"]);
return (
<button {...rest}>
{props.title}
{props.showIcon && <Icon/>}
</button>
);
}
Jag använde en typintersection i mitt exempel, men du kan göra samma sak genom att utöka gränssnittet.
Jag använder Component-typen här, som som standard också lägger till en valfri children-prop till props, även om jag tror att det kommer att förändras med 1.4-utgåvan.
Jag använder också splitProps-metoden för att hjälpa till att undvika destructuring, så att de reaktiva uppdateringarna av prop-värdena bevaras.
Svar #2
På ungefär samma sätt, förutom att du behöver undvika destrukturering för reaktiva egenskaper och istället använda splitProps, så skulle ditt exempel översättas till:
import { splitProps, JSX } from 'solid-js';
interface ButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
title: string;
// better make that optional, so you can use Button without having to
// add the showIcon attribute:
showIcon?: boolean;
}
const Button = (props: ButtonProps) => {
const [local, buttonProps] = splitProps(props, ['title', 'showIcon']);
return (
<button {...buttonProps}>
{local.title}
{local.showIcon && <Icon/>}
</button>
);
};
Som du kan se, typerna av de inbyggda elementens attribut är i JSX, och kommer från jsx-dom-expressions som konverterar JSX till reaktiva uttryck i Solid.
