R-box - An initiative to create a web component to host your HTML and add reactivity to it
r-box
r-box is an initiative to create a web component to host your HTML and add reactivity to it.
- A 2 KB (minified) custom component that adds reactivity to your HTML just with pure JS, HTML and CSS.
- No dependencies
- No render-blocking
Uses
<r-box data-bind="dataObject">
<!-- HTML Template-->
</r-box>
<!--data object to bind with r-box-->
<script>
var dataObject = { };
</script>
<!--add r-box script-->
<script src="src/r-box.js" defer></script>
Directive
r-box has very few directives to add reactivity to HTML
directive | description |
---|---|
data-bind | associate JS object with r-box |
data-* | To add reactivity to the element attribute use data-* directive. For example to add a dynamic class you can use data-class=methodToReturnClass |
react-on | string representation of a list of properties on change of which DOM should adopt the change |
Interpolation
use ${yourVariableName}
to interpolate the yourVariableName
in template. E.g.
<h1>${title}</h1>
Limitation – composite variable interpolation does not work. In the case of complex interpolation use function. E.g.
<h1>${yourFunction}</h1> // yourFunction: () => {return var1 + var2 + var3}
data-*
<input type="text" data-value="yourVariable">
Example
Timer
<r-box data-bind="dataObject">
<label>${label}</label>
<input type="text" data-value="time">
</r-box>
<script>
var dataObject = {
label: 'Time',
time: ''
};
window.setInterval(() => {
dataObject.time = (new Date()).toLocaleString();
}, 1000);
</script>
<script src='https://cdn.jsdelivr.net/gh/ranjanngc/r-box/dist/r-box.v0.0.3.es.min.js' type="module"></script>
See example – https://codepen.io/RanjanKr/pen/oNqGvpj
ToDo List
<r-box data-bind="dataObject">
<ul react-on='["todo"]'>
${addList}
</ul>
<input type="text" data-value="task">
<button onclick="dataObject.clickHandler()">Add Task</button>
</r-box>
<script>
var dataObject = {
task: '',
todo: ['Job1', 'Job2'],
addList: ()=>{
return dataObject.todo.map((td)=> {
return `<li>${td}</li>`;
}).join('')
},
clickHandler : () => {
dataObject.todo.push(dataObject.task);
dataObject.task = '';
dataObject.todo = dataObject.todo;
}
};
</script>
<script src='https://cdn.jsdelivr.net/gh/ranjanngc/r-box/dist/r-box.v0.0.3.es.min.js' type="module"></script>
Enable/Disable
<r-box data-bind="dataObject">
<input type="text" data-disabled="disabled">
<input type="checkbox" data-checked="disabled">
</r-box>
<script>
var dataObject = { disabled: false };
</script>
See example – https://codepen.io/RanjanKr/pen/ExEwpvP
CDN
Minified
<script src='https://cdn.jsdelivr.net/gh/ranjanngc/r-box/dist/r-box.v0.0.2.min.es.js'></script>
Dev
<script src='https://cdn.jsdelivr.net/gh/ranjanngc/r-box/dist/r-box.v0.0.2.es'></script>
Build
npm run build
License
MIT