Code Monkey home page Code Monkey logo

react-loops's Introduction

React Loops โ€” React Velcro Architecture

Build Status Coverage Status

React Loops work alongside React Hooks as part of the novel React Velcro architecture for building sticky, secure user interfaces that don't come apart under pressure.

Version Changelog

Get started with Velcro by installing React Loops!

Install with yarn or npm.

yarn add react-loops

And import into your Javascript.

import { For } from 'react-loops'

React Loops comes ready with both Flow and TypeScript types for high quality integration into codebases that use these tools.

For-of Loops

Use the props of to provide the list and as to provide an element for each item in the list. The of prop accepts Arrays, Array-likes, and Iterables (such as Map, Set, and Immutable.js).

import { For } from 'react-loops'

function Bulleted({ list }) {
  return (
    <ul>
      <For of={list} as={item =>
        <li>{item}</li>
      }/>
    </ul>
  )
}

Or provide a "render prop" function as a child.

import { For } from 'react-loops'

function Bulleted({ list }) {
  return (
    <ul>
      <For of={list}>
        {item =>
          <li>{item}</li>
        }
      </For>
    </ul>
  )
}

For-in Loops

Use the prop in to provide an Object instead of an Array or Iterable.

import { For } from 'react-loops'

function BulletedDefinitions({ terms }) {
  return (
    <ul>
      <For in={terms} as={(item, {key}) =>
        <li>{key}: {item}</li>
      }/>
    </ul>
  )
}

Loop empty conditions

A common pattern when rendering a collection is to render a special case when the collection is empty. Optionally provide an ifEmpty prop to handle this case for both <For in> and <For of> loops.

The ifEmpty prop accepts anything renderable (strings, numbers, JSX) or a function which returns anything renderable.

import { For } from 'react-loops'

function BulletedWithFallback({ list }) {
  return (
     <ul>
      <For of={list} ifEmpty={<em>Nothing here!</em>}>
        {item =>
          <li>{item}</li>
        }
      </For>
    </ul>
  )
}

Loop iteration metadata

Access additional information about each iteration by destructuring the second callback argument:

  • index: A number from 0 to the length of the list
  • length: The length of the list
  • key: The key for this item in the list, same as index for Arrays but string Object properties for in loops
  • isFirst: True for the first iteration
  • isLast: True for the last iteration
import { For } from 'react-loops'

function BulletedSentence({ list }) {
  return (
    <ul>
      <For of={list} as={(item, { isLast }) =>
        <li>{isLast && "and "}{item}</li>
      }/>
    </ul>
  )
}

React Keys & Reorderable Collections

React Loops provides a key prop automatically on each child by default (by using the { key } loop iteration metadata). This is a great default if your collection will not later reorder and an ergonomic improvement over your trained muscle memory of adding key={i} to every list.map() return value.

However, reorderable collections should still directly provide the key prop on the element returned from the loop callback. Read more about Lists and Keys in the React documentation.

import { For } from 'react-loops'

function BulletedReorderable({ list }) {
  return (
    <ul>
      <For of={list} as={item =>
        <li key={item.id}>{item.label}</li>
      }/>
    </ul>
  )
}

What is React Velcro?

Only the newest, coolest, most blazing fast React architecture out there!

React Hooks has been an exciting development in the evolution of React, but it felt like it was only half of the story. React Loops completes the gripping picture by providing React's missing control-flow operators via JSX elements.

The React Velcro architecture was announced by @leebyron on April 1st, 2019.

Is this a Joke?

Take a look at this side by side with the old looping pattern and you tell me (hint).

But isn't this a React anti-pattern? Just go use Angular or Vue?

Yes, React Loops is directly inspired by Angular and Vue. It's also directly inspired by older XML component syntax like XSLT, JSTL, and E4X. These technologies all have their drawbacks, however we should not abandon all aspects of these ideas.

React Loops are not an anti-pattern. array.forEach() is not an anti-pattern despite the existence of the for..of loop and neither is <For>. React Loops follows React's model of components as encapsulation of behavior and state. It uses the "render prop" pattern, like react-router's <Route> component, itself reminiscent of XSLT.

React considers Angular (and Vue) directives as anti-patterns not because they emulate loops or control flow. It is because they affect scope in ways that removes the ability to use plain Javascript, requires a template language, and makes using other tools like ESLint difficult. They also are implemented as attributes (props) on any element which complicates type-checking and implementation.

React Loops avoids these drawbacks by providing <For> as a specific component with a clear signature and callback functions to produce each element for clear, "just Javascript," scoping rules avoiding the need for template languages or additional compilation.

Try React Loops in your project, you just might like it!

Are there any other libraries supporting that React Velcro architecture?

Yes

  • babel-plugin-jsx-control-statements is a Babel plugin with many control statements.

    Its <For> component suffers from some of the problems described above, caveat emptor.

  • react-condition contains the old <If>, <Else>, and <ElseIf> statements from this library, as well as some new ones such as <Switch>, <Case>, and <Default>.
  • react-for is a predecessor and a very similar idea which includes other variants of loops.
  • react-listable is a predecessor of this idea which includes <ol> and <ul> components.

Contributing & License

Contributions are welcome from all who follow the community code of conduct.

  1. Fork this repository
  2. yarn install
  3. Make your change in a branch
  4. Ensure your change includes any relevant tests, type definitions (TypeScript and Flow), and documentation.
  5. yarn test
  6. Create a pull request

React Loops is provided under the MIT license:

Copyright 2019 Lee Byron

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

react-loops's People

Contributors

andrewfluck avatar capaj avatar jessidhia avatar jgcmarins avatar leebyron avatar sashko-stripe avatar zaguiini 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

react-loops's Issues

Implement do-while

Lack of do-while severely hurts React adoption. It has been proven that almost always you enter a loop at least once, there is no sane reason to check if you will enter a loop at all on first invocation. Do-while is much more performant than a for loop that this will also allow us that the clock cycles we lose with immutablejs can be obtained from the additional CPU power this feature would bring, making immutablejs more popular.

React Router Route Component doesn't rerender and execute

export const routes = [
  {
    path: '/',
    exact: true,
    component: PageIndex,
    private: true
  },
  {
    path: '/login',
    exact: true,
    component: PageLogin
  },
]
export const PrivateRoute = ({ component: Component, ...remaining }) => {
  const { authenticated } = useAuthDataContext();
  return (
    <Route
      render={props =>
        authenticated ? <Component {...props} /> : <Redirect to="/login" />
      }
      key={remaining.path}
    />
  );
};

// BUGS OUT WITH ROUTING
// export const renderRoutes = routes => (
//   <For
//     of={routes}
//     as={route =>
//       route.private ? (
//         <PrivateRoute {...route} key={route.path} />
//       ) : (
//         <Route {...route} key={route.path} />
//       )
//     }
//   />
// );
// export const renderRoutes = routes => (
//   <For of={routes}>
//     {route =>
//       route.private ? (
//         <PrivateRoute {...route} key={route.path} />
//       ) : (
//         <Route {...route} key={route.path} />
//       )
//     }
//   </For>
// );
export const renderRoutes = routes =>
  routes.map(route =>
    route.private ? (
      <PrivateRoute {...route} key={route.path} />
    ) : (
      <Route {...route} key={route.path} />
    )
  );

Last one works but the others not.

This is using the basic redirect on react-router to check if user is authenticated.

Any ideas why it doesn't get redirected when using the two above.

What's the benefit this library bring to react?

Is this just syntax sugar for loop? Lol I never thought React Dev favor a angularjs and Vue ish syntax, which I would run far away from because it's adding unnecessary syntax sugar above .map which is completely easy to understand as it's just JS!

sorry I am just not buying it lol but maybe someone will enjoy it? Then may as well go to code with Vue or angularjs lol

TypeScript type definitions aren't correct

The following TypeScript code...

import * as React from 'react';
import { For } from 'react-loops';

const Test: React.FunctionComponent = (props) => {
    const things = {
        foo: 1,
        bar: 2,
    };
    return (
        <dl>
            <For in={things} as={(item, {key}) =>
                <>
                    <dt>{key}</dt>
                    <dd>{item}</dd>
                </>
            }/>
        </dl>
    );
};

...results in this error:

JSX element type 'ReactNode' is not a constructor function for JSX elements.
Type 'undefined' is not assignable to type 'Element | null'.ts(2605)

I found a similar issue at ganderzz/react-scroll-to#89, and the resolution there was to change the return type from React.ReactNode to JSX.Element. Doing the same to the return value of For() in react-loops.d.ts appears to fix the problem.

CHANGELOG.md

I was about to use this lib for <IF> but seems that was nuked. Not a big deal, but there is no warning in the README for the changes, nor there are any releases.

BTW, an drastic API change such as a deletion is usually a 2.0.0 change. If the API is still unstable then that would be typically 0.y.z release (though some are popular for years without hitting v1.0.0).

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.