TSimp
pronounced as T Simp, read as TS imp
Just like SpuckJs, but better and typed!
Description:
- Object oriented, every TSimp object converts to DOM element
- Autocompletion and JS-Doc documentation included, thnx to Typescript
- State Management
- Effect Management
- An easy and intuitive way of sharing states
Features
You can read this to get an idea of getting started, these are spuckjs docs but both the libraries are very similar.
You'll be using a build tool and Vite is recomended.
Initializing:
npm create vite@latest
npm i
npm i tsimp
main.ts
import TSimp from 'tsimp';
const element = new TSimp({ type: 'h1', parent: '#app', class: "heading", id: "head" });
element.prop = {
text: "Hello World",
css: {
color: "blue"
}
};
element.attr = { title: "Heading" };
element.make();
DOM Methods
Library gives some methods to manipulate and listen to the dom.
render()
: converts/update a virtual element (JSimp object) into a physical DOM element.
mount()
: puts the element to the dom.
unMount()
: removes the element from the dom.
isMount()
: checks if the element is in the dom.
onMount(func)
: calls the func
function when an element is mounted.
onUnmount(func)
: ...element is unmounted.
States
States are internal variables of elements that when change automatically update their references in these specific properties:
html, text, css, value, class, id
.
const [count, setCount] = element.state('count', 0);
element.prop = { text: "count is $count$" }
$statename$
- This textual way of referencing states is used in the mentioned 6 properties to get a truly reactive nature.
count
is a function that returns the state value and can be used inside effects and events to get the latest value of thr state.
setCount
updates the state value.
const button = new TSimp({ type: 'button', parent: '#app' });
button.prop = { text: 'Update Count' };
button.events = {
click: () => setCount(count() + 1)
}
button.make();
count()
in the event will always have the latest value of the state as that line of code will call the getter function again.
NOTE
You can perform some elementary operations on states using $
refernce inside text.
Such as:
_.state('state', 0);
_.prop = {
text: "$state + (5 - 2) * 10/2$"
}
_.prop = {
text: "$state > 2 ? 'Good' : 'Bad'"
}
You can't do a single operation on 2 states, like:
"$state1$ + $state2$"
Important:
- Everything has to be done inside
$...$
. - Actual state should touch the first dollar sign.
- This feature also works for pseudo-states (discussed below) that use
%
instead of $
.
"$state + 2 $"
"$state > 2"
"2 + $state"
"$ state + 2"
Sharing States
Suppose another element wants to show the count of element
in its text. For that, it will subscribe for element's state to access them.
For this we use the static method of the class TSimp, i.e,
subscribe
.
import TSimp from 'tsimp';
Tsimp.subscribe();
import TSimp, { subscribe } from 'tsimp';
subscribe();
import TSimp, { subscribe } from 'tsimp';
const para = new TSimp({ type: 'p', parent: '#app' });
subscribe(para, element, []);
para.prop = { text: "Element's count is %count%" };
para.make();
Structure of subscribe method:
subscribe(subscriber, main, forStates);
Subscription Events:
_.onSubscribed(func)
: Called on the subscriber element when subscription is added.
_.onnewSubscriber(func)
: Called on the element to which the subscriber is subscribing when subscription is added.
Effects:
Effects are functions that get called when some states or pseudoStates (dependencies) change
@param func
— this function will get called when the dependencies change
@param dependencyArray
— add states that will affect the effect, examples:
['$count$', '%color%'] (this will run the effect when either of state/pseudoState changes)
['f'] (this will run the effect on the first render only)
['e'] (this will run the effect on every render)
@param onFirst
— default: true, by default every effect runs on its first render whether the deps change or not.
element.effect(func, dependencyArray, onFirst=true);
para example:
para.effect(() => {
console.log('Effect Ran')
}, ['%count%']);
Conditional Mount
This feature allows you to show the element in the DOM only when the condition provided is satisfied.
Continuing with the para
example.
Say we want to show the para
element only when the pseudo-state count
is odd.
We'll use the .putIf
method.
const para = new TSimp({ type: 'p', parent: '#app' });
para.subscribe(element, []);
para.prop = { text: "Element's count is %count%" };
para.effect(() => {
console.log('Effect Ran')
}, ['%count%']);
para.putIf(() => count() % 2 != 0);
para.make();
Structure of putIf
:
.putIf(condition:function:boolean, stick:boolean)
Condition as a String
We can also provide the condition as a string that signifies a boolean expression.
para.putIf(() => count() % 2 != 0);
Doing this in a "stringy" way:
para.putIf('%count% % 2 != 0')
The "stick" parameter:
There is a second parameter to the .putIf
method, "stick : boolean", that can be passed to refer if the element after re-mounting will be in its old position or not.
By default: false
.