Git Product home page Git Product logo

reactable's Introduction

Reactable

Build Status Code Climate

Fast, flexible, and simple data tables in React.

Reactable allows you to display tabular data client-side, and provides sorting, filtering, and pagination over that data. It uses the power of React.js to do all this very, very quickly, and provides an API that makes simple things easy, while trying to get out of your way as much as possible if you want to do something complicated or unconventional.

This project is currently alpha-stage, which means the API may or may not be unstable and there might be hidden bugs lurking around any corner. I'll try to tag any releases with breaking changes, however, and the more people who use this the faster we can get to 1.0!

Note: As of version 0.12.0 Reactable will only continue to support React 0.14 and higher.

Table of Contents

Installation

Using Bower

bower install [--save] reactable

Using NPM

npm install [--save] reactable

Or, you can just download the raw file here.

That file can be used either as an AMD module, as a CommonJS module in Node, or, if neither are supported, will register the Reactable object as a property of the window object.

Reactable also exposes a set of CommonJS modules for piece-by-piece use with Node, Webpack, Browserify, etc. These modules are located in the lib folder at the root of this repositiory.

Keep in mind that Reactable depends on the latest version of React (0.14), which can be downloaded here

Usage

The simplest example:

var Table = Reactable.Table;
ReactDOM.render(
    <Table className="table" data={[
        { Name: 'Griffin Smith', Age: 18 },
        { Age: 23,  Name: 'Lee Salminen' },
        { Age: 28, Position: 'Developer' },
    ]} />,
    document.getElementById('table')
);

While pretty basic, this example demonstrates a couple things:

  • Columns in the data array can be in any order, and you can omit any you like
  • Regular React DOM attributes such as className will pass-through to the rendered <table>
  • Data values can be any type with a toString() method

Further Customization

You can also manually build up your rows using Reactable.Tr nested in a table, also using the data prop, but this time containing only one javascript object. This approach can be freely combined with the data property on the <Table>, and is useful if you want to specify per-row attributes such as classes, like so:

var Table = Reactable.Table,
    Tr = Reactable.Tr;

ReactDOM.render(
    <Table className="table" data={[
        { name: 'Row one', content: 'These are regular data rows' },
        { name: 'Row two', content: 'They work like above' },
    ]} >
        <Tr className="special-row"
            data={{ name: 'Other Row' , content: 'This is a different row' }} />
    </Table>,
    document.getElementById('table')
);

Even More Customization

If you want to customize the rendering of individual columns, you can go a level deeper by embedding a Reactable.Td inside your Reactable.Tr. These have the required column property, and an optional value property if you want to customize the data that's used for sorting and filtering - if the latter isn't specified, the data used will default to the Td's children.

Example:

var Table = Reactable.Table,
    Tr = Reactable.Tr,
    Td = Reactable.Td;

ReactDOM.render(
    <Table className="table" id="table">
        <Tr>
            <Td column="Name" data="Griffin Smith">
                <b>Griffin Smith</b>
            </Td>
            <Td column="Age">18</Td>
        </Tr>
        <Tr>
            <Td column="Name">Lee Salminen</Td>
            <Td column="Age">23</Td>
        </Tr>
        <Tr>
            <Td column="Position">Developer</Td>
            <Td column="Age">28</Td>
        </Tr>
    </Table>,
    document.getElementById('table')
);

Customizing Columns

To override inferring the column list from the attributes of the passed data objects, you can either:

  • Pass a columns array property to the <Table> component, which can be either:
    • An array of strings, in which case only the given properties will be included as columns in the rendered table.
    • An array of objects, each of which must have a key and label property. The key property is the attribute of the row object from which to retrieve value, and the label is the text to render in the column header row.
  • Define a <Thead> component as the first child of the <Table>, with <Th> components as children (note the exclusion of a <Tr> here), each of which should have a "column" property. The children of these <Th> components (either strings or React components themselves) will be used to render the table headers. For example:
var Table = Reactable.Table,
    Thead = Reactable.Thead,
    Th = Reactable.Th,
    Tr = Reactable.Tr,
    Td = Reactable.Td;

ReactDOM.render(
    <Table className="table" id="table">
        <Thead>
          <Th column="name">
            <strong className="name-header">First Name, Last Name</strong>
          </Th>
          <Th column="age">
            <em className="age-header">Age, years</em>
          </Th>
        </Thead>
        <Tr>
            <Td column="name" data="Griffin Smith">
                <b>Griffin Smith</b>
            </Td>
            <Td column="age">18</Td>
        </Tr>
        <Tr>
            <Td column="name">Lee Salminen</Td>
            <Td column="age">23</Td>
        </Tr>
        <Tr>
            <Td column="position">Developer</Td>
            <Td column="age">28</Td>
        </Tr>
    </Table>,
    document.getElementById('table')
);

In this example, the position column will not be rendered.

Additional node types

Reactable also supports specifying a <tfoot> for your table, via the Reactable.Tfoot class. Per the HTML spec, there can only be one <Tfoot> per table and its only children should be React.DOM <tr> elements (not <Reactable.Tr> elements).

Preventing escaping of HTML

If you don't want to go all the way down the JSX rabbit hole to render individual cells as HTML, and you know your source data is safe, you can wrap strings in Reactable.unsafe to prevent their content from being escaped, like so:

var Table = Reactable.Table,
    unsafe = Reactable.unsafe;

ReactDOM.render(
    <Table className="table" id="table" data={[
        {
            'Name': unsafe('<b>Griffin Smith</b>'),
            'Github': unsafe('<a href="https://github.com/glittershark"><img src="https://d2k1ftgv7pobq7.cloudfront.net/images/services/8cab38550d1f23032facde191031d024/github.png"></a>')
        },
        {
            'Name': unsafe('<b>Ian Zhang</b>'),
            'Github': unsafe('<a href="https://github.com/lofiinterstate"><img src="https://d2k1ftgv7pobq7.cloudfront.net/images/services/8cab38550d1f23032facde191031d024/github.png"></a>')
        },
    ]}/>,
    document.getElementById('table')
);

You can also pass in unsafe strings as column labels or in a <Reactable.Th>

Pagination

You can also use pagination, by just specifying an itemsPerPage argument to the <Table> component. Include an optional pageButtonLimit argument to customize the number of page buttons in the pagination, which defaults to 10. For example:

<Table className="table" data={[
    { Name: 'Griffin Smith', Age: '18' },
    { Age: '23',  Name: 'Lee Salminen' },
    { Age: '28', Position: 'Developer' },
    { Name: 'Griffin Smith', Age: '18' },
    { Age: '30',  Name: 'Test Person' },
    { Name: 'Another Test', Age: '26', Position: 'Developer' },
    { Name: 'Third Test', Age: '19', Position: 'Salesperson' },
    { Age: '23',  Name: 'End of this Page', Position: 'CEO' },
]} itemsPerPage={4} pageButtonLimit={5} />

You can also change the default text on the buttons by including the previousPageLabel and nextPageLabel props.

Sorting

To enable sorting on all columns, just specify sortable={true} on the <Table> component. For further customization, ie disabling sort or using a custom sort function on a per-column basis, you can pass an array to sortable, which contains either string column names or column objects.

We've pre-built some sort functions for you.

  • CaseInsensitive will sort strings alphabetically regardless of capitalization (e.g. Joe Smith === joe smith)
  • Date will sort dates using JavaScript's native Date parser (e.g. 4/20/2014 12:05 PM)
  • Currency will sort USD format (e.g. $1,000.00)
  • Numeric will parse integer-like strings as integers (e.g. "1")
  • NumericInteger will parse integer strings (use Numeric if you might have floats)

To specify a custom sort function, use the following structure for the column object:

{column: 'Column Name', sortFunction: function(a, b){
    return a > b ? 1 : -1;
}}

You can also specify a default sort by passing in either a column name by itself, or an object with a column and a direction paramenter of either asc or desc. If no direction is specified, the default sort will be ascending. Example:

{column: 'Column Name', direction: 'asc' }

Combined example:

<Table className="table" id="table" data={[
    { Name: 'Lee Salminen', Age: '23', Position: 'Programmer'},
    { Name: 'Griffin Smith', Age: '18', Position: 'Engineer'},
    { Name: 'Ian Zhang', Age: '28', Position: 'Developer'}
]}
sortable={[
    {
        column: 'Name',
        sortFunction: function(a, b){
            // Sort by last name
            var nameA = a.split(' ');
            var nameB = b.split(' ');

            return nameA[1].localeCompare(nameB[1]);
        }
    },
    'Age',
    'Position'
]}
defaultSort={{column: 'Age', direction: 'desc'}}/>

In case you are constructing your table without the data attribute, and the cells contain some additional HTML elements, you can use the value property on the Td element to define the value to sort for.

In the following example we define two TDs, where the first contains some additional markup. We tell the Td to take "Griffin Smith" as value for data handling (filter or sort).

var Table = Reactable.Table,
    Tr = Reactable.Tr,
    Td = Reactable.Td;

ReactDOM.render(
    <Table className="table" id="table" sortable={true}>
        <Tr>
            <Td column="Name" value="Griffin Smith">
                <div>
                   <span>Some Text or Icon</span>
                   <b>Griffin Smith</b>
                </div>
            </Td>
            <Td column="Age">18</Td>
        </Tr>
    </Table>,
    document.getElementById('table')
);

There is also an boolean defaultSortDescending option to default the sorting of a column to descending when clicked:

<Table className="table" id="table" data={[
    { Name: 'Lee Salminen', Age: '23', Position: 'Programmer'},
    { Name: 'Griffin Smith', Age: '18', Position: 'Engineer'},
    { Name: 'Ian Zhang', Age: '28', Position: 'Developer'}
]}
sortable={[
    'Age',
    'Position'
]}
defaultSort={{column: 'Age', direction: 'desc'}}
defaultSortDescending

Filtering

You can do simple case-insensitive filtering by specifying a filterable property on the table. This property should contain a list of columns which the filter is performed on. If the filterable property is provided, then an input box with class reactable-filter-input will be prepended to the thead of the table.

Example:

<Table className="table" id="table" data={[
    {'State': 'New York', 'Description': 'this is some text', 'Tag': 'new'},
    {'State': 'New Mexico', 'Description': 'lorem ipsum', 'Tag': 'old'},
    {'State': 'Colorado',
     'Description': 'new description that shouldn\'t match filter',
     'Tag': 'old'},
    {'State': 'Alaska', 'Description': 'bacon', 'Tag': 'renewed'},
]} filterable={['State', 'Tag']} />

There is also a filterBy() function on the component itself which takes a single string and applies that as the filtered value. It can be used like so:

var table = ReactDOM.render(
  <Table className="table" id="table" data={[
      {'State': 'New York', 'Description': 'this is some text', 'Tag': 'new'},
      {'State': 'New Mexico', 'Description': 'lorem ipsum', 'Tag': 'old'},
      {'State': 'Colorado',
       'Description': 'new description that shouldn\'t match filter',
       'Tag': 'old'},
      {'State': 'Alaska', 'Description': 'bacon', 'Tag': 'renewed'},
  ]} filterable={['State', 'Tag']} />,
  document.getElementById('table')
);

table.filterBy('new');

You can also pass in a filterBy prop to control the filtering outside of the Table component:

var table = ReactDOM.render(
  <Table className="table" id="table" data={[
      {'State': 'New York', 'Description': 'this is some text', 'Tag': 'new'},
      {'State': 'New Mexico', 'Description': 'lorem ipsum', 'Tag': 'old'},
      {'State': 'Colorado',
       'Description': 'new description that shouldn\'t match filter',
       'Tag': 'old'},
      {'State': 'Alaska', 'Description': 'bacon', 'Tag': 'renewed'},
  ]} filterable={['State', 'Tag']}
  filterBy="new" />,
  document.getElementById('table')
);

If you are using your own input field to control the filterBy prop, you can hide the build-in filter input field with the hideFilterInput prop:

var table = ReactDOM.render(
  <Table className="table" id="table" data={[
      {'State': 'New York', 'Description': 'this is some text', 'Tag': 'new'},
      {'State': 'New Mexico', 'Description': 'lorem ipsum', 'Tag': 'old'},
      {'State': 'Colorado',
       'Description': 'new description that shouldn\'t match filter',
       'Tag': 'old'},
      {'State': 'Alaska', 'Description': 'bacon', 'Tag': 'renewed'},
  ]} filterable={['State', 'Tag']}
  filterBy="new"
  hideFilterInput />,
  document.getElementById('table')
);

These can be useful if you want to roll your own filtering input field outside of Reactable.

You can also provide your own custom filtering functions:

<Table className="table" id="table" data={[
    {'State': 'New York', 'Description': 'this is some text', 'Tag': 'new'},
    {'State': 'New Mexico', 'Description': 'lorem ipsum', 'Tag': 'old'},
    {'State': 'Colorado',
     'Description': 'new description that shouldn\'t match filter',
     'Tag': 'old'},
    {'State': 'Alaska', 'Description': 'bacon', 'Tag': 'renewed'},
]}
filterable={[
    {
        column: 'State',
        filterFunction: function(contents, filter) {
            // case-sensitive filtering
            return (contents.indexOf(filter) > -1);
        }
    },
    'Tag'
]} />

Your filter function must return a boolean. Refraining from specifying a custom filter function will default to case-insensitive filtering.

Empty Data Sets

If the table is initialized without any <Tr>s or with an empty array for data, you can display text in the body of the table by passing a string for the optional noDataText prop:

var table = ReactDOM.render(
  <Table
    className="table"
    id="table" data={[]}
    noDataText="No matching records found." />,
  document.getElementById('table')
);

Events

You can pass functions to the following props of <Reactable.Table> to provide event handlers.

onSort

Called when the sorting in the table changes.

This handler will be passed an object that contains the column name that is being sorted by, and the direction it is being sorted:

{
  column: 'Name',
  direction: -1
}

onFilter

Called every time the filtering changes.

This handler will be passed a string containing the text that's being used for filtering.

onPageChange

Called every time the page changes.

This handler will be passed a number representing the current page, zero based.

reactable's People

Contributors

akohout avatar bobsamuels avatar cklab avatar cymen avatar davidblurton avatar dis-aster-ous avatar dmistomin avatar fiatjaf avatar glittershark avatar igorsantos07 avatar jasonblanchard avatar jkbrooks avatar jonathanbruce avatar joneshf avatar kamransyed avatar kendallpark avatar leesalminen avatar razh avatar reggi avatar rtsao avatar samdolan avatar samm0ss avatar shinnc avatar stefanyohansson avatar thechrisproject avatar tjphopkins avatar tobernguyen avatar tsargent avatar wemcdonald avatar y2468101216 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

reactable's Issues

jQuery dependency

Are you using the jQuery dependency outside of the tests? I couldn't find anything in a quick search of the codebase.

In that case, maybe it might be better to remove it and just use selector methods on document.

Reactable should not display columns that aren't listed in the columns prop

The columns prop needs to drop all columns from the table that are not supplied in the object/array. This way you can get all the data you need back, like ids and such, and yet not display them in the table. This could be resolved by only pulling out data for the table, but we would end up doing multiple queries and patching together arrays/objects on the other side.q

Filtering should update active page when current page # > # filtered pages

To repro,

(1) Visit demo at http://glittershark.github.io/reactable/
(2) Click on page 2 (or greater) of the table.
(3) Type in "Albuquerque" in the filter, which returns one page of results.

What happens: The user is still on the page they selected manually (in this case, page 2).
What should happen: The user should land on the page number closest to the one they manually selected (in this case, 1).

This is a usability problem because a user may think that their filter turned up 0 results if they see a blank page.

NPM

This lib is so fantastic :) I'm currently using it on a few sites, but all my dependencies use npm. I'm going to fork this library and publish it to npm under the name 'react-table-component'. I'll be making a few minor revisions ('search' placeholder in the search box) as well as internally restructure the lib for use with browserify / npm (which I'm currently using in these projects). I'd love to contribute more to this library and I'd gladly publish this version on npm under the name 'reactable' if you want it there. There are a few issues/features I will attempt to address over the next few weeks that will be geared more towards it's use within browserify (not UMD or standalone).

Provide some default sort functions

We should provide a library of default sort functions namespaced under Reactable.Sort -- stuff like Reactable.Sort.integer or Reactable.Sort.Date

Add a flag to not escape HTML content in cells

The default React behavior of escaping rendered HTML content in cells is fine, but for people who don't want to go so far down the react/jsx rabbit hole to use Reactable.Td, we should provide an option somehow to specify which columns/cells/etc should be unsafeInnerHtmled.

Rows and cells should be configurable/customizable

We need the ability to manipulate rows and cells so that we can apply custom attributes. Example: adding a link around the row so that you can click on the row to edit the row. Example: the value of the cell is true and we want a glyphicon check, or a glyphicon remove for false.

Column Callbacks

You should be able to run callbacks on columns, to manipulate data client-side. I use timeago.js to turn unix timestamps into something more colloquial.

Only one table works per page

The defaultProps object that is used in Reactable is getting polluted with the first instance of column data created. From the React docs:

getDefaultProps
    object getDefaultProps()
Invoked once and cached when the class is created. Values in the mapping will be set on 
this.props if that prop is not specified by the parent component (i.e. using an in check).

This method is invoked before any instances are created and thus cannot rely on this.props. In 
addition, be aware that any complex objects returned by getDefaultProps() will be shared across 
instances, not copied.

Because of the way columns are passed around and modified, the default props object is getting polluted with data from instances of the class. This causes the first instance of a table to work fine, but the subsequent ones all have the same columns as the first, so if they use different columns, nothing displays.

To demonstrate, navigate to http://glittershark.github.io/reactable/ and run the following code in the console:

$('body').append('<div id="testTable"></div>');
React.renderComponent(Reactable.Table({data:[{foo:'bar', baz:'qux'}]}), document.getElementById('testTable'));

I don't have time to write a good fix for this at the moment.

Refactor explicit exclusion of props to be passed down to DOM components

See the discussion on 0930127 and #34 for more information - essentially right now we're explicitly defining a list of properties to exclude from being passed to the DOM nodes that the various Reactable components wrap. This isn't 100% optimal as that list has to be maintained going down the road. Given that everything works right now this isn't critical, but I'm creating this issue as a note that this bit of code is a candidate for refactoring.

/cc @fiatjaf

Row Callbacks

Hi, Similar to #5, I think it would be cool to have row callbacks. My particular use case is to perform some action (highlighted) when a row is selected (clicked). I also have cases where I need to perform an action (popup a modal, etc... ) when a row is double clicked.

I'll try to look through your source this week and see if I can maybe help.

Thanks!

Pagination required after filtering from any page other than 1

If you filter from a page other than 1, you must click the page 1 link in order to see your filtered results. This assumes that your results are limited to page 1. If you have 10 pages of stuff, click on page 6, then filter by something that results in less than six pages, you're still technically on page 6 so you see no results. However, there could be pagination links 1 - 5. If you click on any of those links you will see the filtered data.

Support colspan and rowspan

Reactable should support table cells with colspan and rowspan. We need to figure out how these cells are filtered and sorted, how they're displayed when one but not all of the related rows are present, etc.

See #83 for the original impetus for this.

Support CommonJS Modules

Many people would like to import this project as a CommonJS module and build as part of their build process (e.g. browserify, webpack, etc.).

Do you have plans to support them? It seems like it's standard in a lot of React projects.

Testing framework

I see you use Mocha with Chai right now, is there a particular reason for doing that?

Karma has very good support for Jasmine (basically, you just identify your frameworks as ['jasmine'] and add karma-jasmine.

It wouldn't make a huge difference, but I think the familiarity of Jasmine could help lower the barrier to contribution.

Rows not displayed when using .setState()

Hi,

I must admit that I'm fairly new to react but after following the introductory comment tutorial I tried to wrap my knowledge around reactable and fill it with data by calling this.setState() but it only updates the column names and now rows show up.

Here is my code so far:

/** @jsx React.DOM */
var Table = Reactable.Table;

var TableController = React.createClass({
  render: function() {
    return (
      <div className="tblControlls">
        <h3>I am a table controller! <small>source selection/limiter/deletedfilter</small></h3>
      </div>
    );
  }
});


var TableBox = React.createClass({
  getInitialState: function() {
    return {data:[]};
  },
  componentDidMount: function() {
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      success:function(data) {
        console.log("Setting data - "+data.length + " items")
        this.setState({data: data});
      }.bind(this),
      error: function(xhr, status, err) {
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  },
  render: function() {
    return (
      <div className="tableBox">
        <TableController />
        <Table className="table table-striped" data={this.state.data}/>
      </div>
    );
  }
});



React.renderComponent(
    <TableBox url="TableData"/>
    ,document.getElementById('myTable')
);

I just installed the react dev tools, with it I can see the Tr's but they are somehow not displayed on the page.. Is this a bug or am I missing something?

reactablenorows

Refactor how we test if a variable is a React component

To fix #76, in cfcd831 I added a function that checks if a variable is a React component by testing if typeof(thing.props) !== 'undefined'. This is a hacky and not very robust way of making this test, and should be refactored to do the test the way React itself does it.

Support for column types

Hi there,

I was wondering if you had any plans or thoughts on implementing types of columns. This arises from the need to have action buttons in a column of their own for CRUD operations and more.

Current thoughts:
  • A Data column type, the default, would map to the current functionality provided by reactable
  • An Action column type, where button callbacks and a button template would provide high flexibility for all manner of row actions... button callbacks would have access to the entire row's data
  • An Unsafe column type would provide a column where data is treated as unsafe (similar to your unsafe() function, but on an entire column)
  • Users would be able to easily create their own column types

Filtering

You should be able to filter data.

Support propTypes

I'm attempting to use these components, when trying to learn what all I can do it's immensely easier to understand if each component defines the propTypes it uses. Trying to glean the information from the README can work, but it's not set up for quick glances at what is actually used.

I'll gladly submit a PR for this if you can enumerate what all the props are (again, reading the README can get me this info, but it'll take longer and I assume you know better what each is supposed to do).

Nested data

I have some objects that I want to display. It happens that sometimes the objects contains objects themselves. Currently, reactable just stringifies it, so you end up with "[object Object]" or some such. How do you want to handle nested data like this?

Switch Karma target to PhantomJS

I see you use Firefox for your Karma testing, any thoughts on using PhantomJS instead?

It's fairly easy to introduce a "pure" node dependency for it (or you can just use the normal system install) and doesn't require popping up a browser or anything. You will need to introduce a polyfill for .bind, but adding ES5 shim should make that easy (and make IE8 work).

(Also, maybe dependencies should be removed for the unused launchers)

Expose hooks for specific events

I'm talking about perhaps accepting a function as a prop named onFilter which would be called with the filtered expression, maybe the filter results, I don't know (I would be happy with the filtered expression), and another function as a prop named onSort which would be called with the column and direction being used to sort.

Good thing? Too much bloating?

Need for bower?

Right now, all that bower pulls in are the global React, jQuery, and Chai dependencies. Do we need these, or can we get rid of this bower file? (edit: I see es5-shim is also checked in but not in the bower package file. Maybe we can pull the npm version of this also.)

I also found that the tests do a lot of DOM checking which aren't necessary if you use the React TestUtils' (renderIntoDocument)[http://facebook.github.io/react/docs/test-utils.html#renderintodocument].

Related to #47, but I think I would even like to replace Chai with Jasmine. What do you think?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.