@solid-primitives/props
Library of primitives focused around component props.
combineProps
- Reactively merges multiple props objects together while smartly combining some of Solid's JSX/DOM attributes.createProps
- Provides controllable props signals like knobs/controls for simple component testing.
Installation
npm install @solid-primitives/props
# or
yarn add @solid-primitives/props
combineProps
A helper that reactively merges multiple props objects together while smartly combining some of Solid's JSX/HTML attributes.
Event handlers (onClick, onclick, onMouseMove, onSomething), and refs (props.ref) are chained.
class
, className
, classList
and style
are combined.
For all other props, the last prop object overrides all previous ones. Similarly to Solid's mergeProps.
How to use it
import { combineProps } from "@solid-primitives/props";
const MyButton: Component<ButtonProps> = props => {
const { buttonProps } = createButton();
const combined = combineProps(props, buttonProps);
return <button {...combined} />;
};
<MyButton style={{ margin: "24px" }} />;
Chaining of event listeners
Every function/tuple property with on___
name get's chained. That could potentially include properties that are not actually event-listeners – such as only
or once
. Hence you should remove them from the props (with splitProps).
Chained functions will always return void
. If you want to get the returned value from a callback, you have to split those props and handle them yourself.
Warning: The types for event-listeners often won't correctly represent the values. Chaining is meant only for DOM Events spreading to an element.
const combined = combineProps(
{
onClick: e => {},
onclick: e => {}
},
{
onClick: [(n, e) => {}, 123]
}
);
For better reference of how exactly combineProps
works, see the TESTS
Additional helpers
A couple of lower-lever helpers that power combineProps
:
stringStyleToObject
const styles = stringStyleToObject("margin: 24px; border: 1px solid #121212");
styles;
combineStyle
const styles = combineStyle("margin: 24px; border: 1px solid #121212", {
margin: "2rem",
padding: "16px"
});
styles;
createProps
Primitive that provides controllable props signals like knobs/controls for simple component testing
How to use it
You can either create a single prop:
const [string, setString, stringField] = createControlledProp("stringValue", "test");
const [language, setLanguage, languageField] = createControlledProp(
"language",
{ initialValue: "en", options: ["de", "en", "fr", "it"] as const }
);
enum Currency {
AUD,
GBP,
EUR,
USD,
CHF,
JPY,
CNY
}
const [currency, setCurrency, currencyField] = createControlledProp("currency", {
initialValue: Currency.USD,
options: Currency
});
return { languageField(); };
or multiple props in one call:
enum Test { One, Two, Three };
const languages = ['de', 'en', 'fr', 'it'] as const;
const [props, fields] = createControlledProps({
boolean: true,
number: 42,
string: 'text',
array: { initialValue: 'en', options: languages },
enum: { initialValue: Test.Three, options: Test }
});
props == {
boolean: Accessor<boolean>,
setBoolean: Setter<boolean>,
number: Accessor<number>,
setNumber: Setter<number>,
string: Accessor<string>,
setString: Setter<string>,
array: Accessor<string>,
setArray: Setter<string>,
enum: Accessor<Test>,
setEnum: Setter<Test>
};
fields == JSX.Element[];
Demo
TODO
Changelog
Expand Changelog
0.0.100
Initial release
1.0.2
Release initial version with CJS support.
2.0.0 - PR#127
Renamed createProps
to createControlledProps
, createProp
to createControlledProp
etc. (for all of the primitives focused on testing)
Added combineProps
primitive
2.1.0
Add support for tuple event handlers and de-dupeing to combineProps
.