JSFiddle - React, Tailwind, and code Playground
HTML
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.3.5/knockout.mapping.js"></script>
<table>
<thead>
<tr data-bind="foreach: columns">
<th data-bind="text: headerText, click: sortBy, css: sortClass"></th>
</tr>
</thead>
</table>
CSS
.no_sorting{
}
.sorting_asc{
color:green
}
.sorting_desc {
color:red
}
JavaScript
var Parent = function(){
var self = this;
self.columns = ko.observableArray([
new Column("col1", self),
new Column("col2", self),
new Column("col3", self)
]);
}
var Column = function(headerText, parent){
var self = this;
self.parent = parent;
self.sortDirection = ko.observable();
self.headerText = ko.observable(headerText);
self.sortClass = ko.computed(function(){
if (!self.sortDirection()){
return 'no_sorting';
}
return self.sortDirection() == 'ascending' ? 'sorting_asc' : 'sorting_desc';
},self);
self.sortBy = function(){
if (!self.sortDirection()) {
self.sortDirection('ascending');
} else if (self.sortDirection() === 'ascending'){
self.sortDirection('descending');
} else {
self.sortDirection('ascending');
}
}
}
ko.applyBindings(new Parent())