Open24

JavaScriptについて勉強していく

winnie279winnie279

if文の代わりの書き方

Reactでよくやる

- let hoge;
- if (condition) {
-   hoge = 'value';
- }
+ const hoge = condition && 'value';

他にもこれは使えそう(賛否はある)

- let player;
- if (name) {
-     player = name;
- } else{
-     player = 'anonymous';
- }
+ const player = name || 'anonymous';

https://qiita.com/Imamotty/items/bc659569239379dded55
(少し改変)

winnie279winnie279

RedwoodJS

Documents

https://redwoodjs.com/docs/tutorial/chapter1/file-structure

Summary

RedwoodJSはフルスタックフレームワークの1つ。フロントエンドはReact、バックエンドはNode.jsで実装する。また、フロントエンドとバックエンド間のやり取りはGraphQLで行われる。

Routing

import { Router, Route } from '@redwoodjs/router'

const Routes = () => {
  return (
    <Router>
      <Route path="/" page={HomePage} name="home" />
      <Route notfound page={NotFoundPage} />
    </Router>
  )
}

export default Routes

Scaffold

GraphQLのスキーマを元に、テンプレートとなる「骨組み」を自動生成する。

yarn redwood generate scaffold hoge

主に以下のテンプレートを自動生成する。

  • web/src/Routes.jsx
  • web/src/pages/Hoge
  • web/src/components/Hoge
  • api/src/graphql/hoges.sdl.jsx
  • api/src/services/hoges/hoges.js

Page

URLごとのUI。ページ。
データフェッチの前にレンダリングできる。

Cell

データのやり取りを担う。 async/await を使うような処理はここに書く。

yarn redwood generate cell Hoge

以下のテンプレートを自動生成する。

  • /web/src/components/HogesCell/HogesCell.jsx

Component

データフェッチの後にレンダリングするUI(Cellは除く)。

winnie279winnie279

Remix

フルスタックフレームワーク。React Router V6のNestedRoutingをサポート。SSGの機能は備えていない。

https://remix.run/

winnie279winnie279

Remix can prefetch everything in parallel before the user clicks a link.
Zero loading states. Zero skeleton UI. Zero jank.

It looks like traditional HTML forms but enables fully dynamic web experiences you’re after.

export default function NewInvoice() {
  return (
    <Form method="post">
      <input type="text" name="company" />
      <input type="text" name="amount" />
      <button type="submit">Create</button>
    </Form>
  );
}

export async function action({ request }) {
  const body = await request.formData();
  const invoice = await createInvoice(body);
  return redirect(`/invoices/${invoice.id}`);
}

公式ページおもしろい。

https://remix.run/

winnie279winnie279

loader functions are the backend "API" for their component, and it's already wired up for you through useLoaderData.

https://remix.run/docs/en/1.19.3/tutorials/blog#loading-data

dynamic routing

The part of the filename attached to the $ becomes a named key on the params object that comes into your loader. This is how we’ll look up our blog post.

app/routes/posts.$slug.tsx
import type { LoaderArgs } from "@remix-run/node";
import { json } from "@remix-run/node";
import { useLoaderData } from "@remix-run/react";

export const loader = async ({ params }: LoaderArgs) => {
  return json({ slug: params.slug });
};

export default function PostSlug() {
  const { slug } = useLoaderData<typeof loader>();
  return (
    <main className="mx-auto max-w-4xl">
      <h1 className="my-6 border-b-2 text-center text-3xl">
        Some Post: {slug}
      </h1>
    </main>
  );
}
winnie279winnie279

React Router

Client Side Routing

Client side routing allows your app to update the URL from a link click without making another request for another document from the server.

https://reactrouter.com