{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# ReactのContext周りについて\n",
"\n",
"- 2018/11/14 勉強会"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# アジェンダ\n",
"\n",
"1. ContextAPI概要\n",
"1. APIの紹介\n",
"1. Reduxとの使い分け\n",
"1. Hooksを使う\n",
"1. 先日のreact-reduxのリリースについて\n",
"1. 参考"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# ContextAPI概要\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## 従来のReact\n",
"\n",
"- 親から子へデータを渡すときはpropsを使う\n",
"\n",
"```\n",
"// 親\n",
"export default class Parent extends React.Component {\n",
" render() {\n",
" const count = 1;\n",
" // `count`を子孫にわたす\n",
" return
count: {count}
\n", " \n", " >\n", " );\n", " }\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 解説\n", "\n", "#### [Class.contextType](https://reactjs.org/docs/context.html#classcontexttype)\n", "\n", "- 前の例と同じように、Childコンポーネントではなにもしていない\n", "- `value`で値と一緒に関数も渡している\n", "```\n", "{counter.num}
\n", " \n", " >\n", " );\n", "};\n", "```\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 解説\n", "\n", "- Consumerを使わずにcontextを受け取れる\n", "- 今まではConsumerの中に関数を書いたりしないといけなかったが、それもなくなり通常通りの書き方できる\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## ContextAPI + react-redux\n", "\n", "- 先日のリリース \n", " - [Release v6.0.0-beta.1 · reduxjs/react-redux](https://github.com/reduxjs/react-redux/releases/tag/v6.0.0-beta.1)\n", " - `yarn add react-redux@next`で入れる \n", " - `yarn add redux` reduxも \n", "- [テストコード](https://github.com/reduxjs/react-redux/blob/85fb553ba8e3f4b0efc158d2e48aafb4c18a04d4/test/components/Provider.spec.js)を参考に\n", "- `ReactReduxContext`というコンポーネントが用意された\n", " \n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "## reduxっぽいやつ(未完成)\n", "\n", "- hooksも使いたい\n", "- https://github.com/HriBB/react-repro/blob/e3177115ae655c7392fda182d4cdd39a70e6628a/pages/index.js\n", "\n", "```\n", "import React from 'react';\n", "\n", "// store的ななにか\n", "const store = new class {\n", " state = {\n", " num: 0\n", " };\n", " actions = fn => {\n", " console.log(this.state);\n", " this.state = fn(this.state);\n", " };\n", " // actions: fn => {\n", " // this.state = fn(this.state);\n", " // }\n", " // actions: {\n", " // increment: () => {\n", " // this.state.num += 1;\n", " // }\n", " // }\n", "}();\n", "\n", "// contextを作る\n", "const CounterContext = React.createContext({ num: 0 });\n", "\n", "// 親\n", "export default class Parent extends React.Component {\n", " render() {\n", " return (\n", "parenat: {store.state.num}
\n", "num
\n", "{state.num}
\n", " \n", " >\n", " );\n", " }\n", "}\n", "\n", "// Consumer使う版\n", "// const Grandson = () => (\n", "//{state.num}
\n", "// \n", "//