React ノート
<Switch>
<Route path="/event/1" component={Dashboard} />
<Route path="/event/:event_slug" component={EventDetail} />
</Switch>
<Route>を<Switch>の中に列挙することで、どれか一つだけが実行されます。上から順番に比較され最初にマッチした物が実行されるようです。逆にグローバルナビなど同時に実行したい物である場合は<Switch>の外に出しておく必要があります。
₍参考₎[https://blog.katsubemakito.net/react/react1st-24-router2]
return render
render は クラスの時のみに使われる
【JS】packages.jsonのprivate:true
npm は ライブラリ管理とライブラリ公開 の2機能アリ 後者をオフにする
npm
package.json の記述
"main": "dist/index.js",
"build-package": "npm run build-package-css && babel src --out-dir dist"
webpack teserwebpackPlugin
更新関数 遅れて値が変更される問題
なぜセットした値が更新されていないのか?
理由:setStateで値が更新されるのは関数が呼び出された後だから
##filter array メソッド
import React, { useState } from 'react'
import Menu from './Menu'
import Categories from './Categories'
import items from './data'
// dynamically calculate unqiue values here
const categories = []
function App() {
const [menuItems, setMenuItems] = useState(items)
const filterItems = (category) => {
if (category === 'all') {
setMenuItems(items)
} else {
setMenuItems(items.filter((item) => item.category === category))
}
}
return (
<main>
<section className="menu section">
<div className="title">
<h2>our menu</h2>
<div className="underline"></div>
</div>
<Categories categories={categories} filterItems={filterItems} />
<Menu items={menuItems} />
</section>
</main>
)
}
export default App
const questions = [
{
questionText: 'What is the capital of France?',
answerOptions: [
{ answerText: 'New York', isCorrect: false },
{ answerText: 'London', isCorrect: false },
{ answerText: 'Paris', isCorrect: true },
{ answerText: 'Dublin', isCorrect: false },
],
},
{
questionText: 'Who is CEO of Tesla?',
answerOptions: [
{ answerText: 'Jeff Bezos', isCorrect: false },
{ answerText: 'Elon Musk', isCorrect: true },
{ answerText: 'Bill Gates', isCorrect: false },
{ answerText: 'Tony Stark', isCorrect: false },
],
},
上記のjsonに対して
<div className="question-text">
{questions[0].questionText}
</div>
// 'What is the capital of France?',
map の練習
正しい
<div className="answer-section">
{questions[0].answerOptions.map((answer) => {
// Add onClick listener to this button
return (
<button key={answer.answerText}>
{answer.answerText}
</button>
)
})}
</div>
誤り
<div className="answer-section">
{questions.map((q)=>{
return(
<button key={q[0].answerOptions.answerText}>
{q[0].answerOptions.answerText}
</button>
)
})}
</div>
</div>
Adding question index state variable
import React, {useState} from 'react'
// Define function body to increment the question index variable
function handleAnswerClick() {
setCurrentIndex(currentIndex +1);
console.log(currentIndex)
}
// Define a state variable here to track question status
const [currentIndex, setCurrentIndex] = useState(0)
return (
<div className="app">
{false ? (
<div className="score-section">
You scored 1 out of {questions.length}
</div>
) : (
<>
<div className="question-section">
<div className="question-count">
<span>Question 1</span>/{questions.length}
</div>
{/* You should change the "0" here to a state variable */}
<div className="question-text">
{questions[currentIndex].questionText}
</div>
</div>
{/* You should change the "0" here to a state variable */}
<div className="answer-section">
{questions[currentIndex].answerOptions.map((answer) => {
// Add onClick listener to this button
return (
<button key={answer.answerText} onClick={handleAnswerClick}>
{answer.answerText}
</button>
)
})}
</div>
</>
)}
</div>
)
}
#Uncaught TypeError: Cannot read properties of undefined (reading 'map')
// valid.map((v)
(valid || []).map((v) => {
console.log(v);
if (v.type == "length") {
let check = length(e.target.value, v.min, v.max);
status = check.valid;
errormesse += check.message;
}
クリーンアップを必要としない副作用
時に、React が DOM を更新した後で追加のコードを実行したいという場合があります。ネットワークリクエストの送信、手動での DOM 改変、ログの記録、といったものがクリーンアップを必要としない副作用の例です。なぜかというとそれらのコードが実行されたあとすぐにそのことを忘れても構わないからです。クラスとフックとでそのような副作用をどのように表現するのか比較してみましょう。
MUI: A component is changing the default value state of an uncontrolled Textfield after being initialized. To suppress this warning opt to use a controlled Textfield
レンダリングは悪いことではない ->Reactが実際にDOMに変更を加える必要があるかどうかを知る方法だから
is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>
Route コンポーネントでレンダリングするやり方3通り
const Hoge = props => {
const { match, location, history } = props;
...
}
<Route path="/hoge" component={Hoge} />;
<Route path="/hoge" render={routeProps => <Hoge {...routeProps} />} />;
<Route path="/hoge" children={routeProps => <Hoge {...routeProps} />} />;
<Switch>
{routes.map((prop, key) => {
if (prop.layout === "/admin") {
if (prop.path === "/dashboard") {
return (
<Route
path={prop.layout + prop.path}
// Dashboard コンポに直にdataを流したかったので以下でPropsとしてdataを渡してる
render={(props) => <Dashboard data={data} {...props} />}
key={key}
></Route>
);
} else {
return (
<Route
path={prop.layout + prop.path}
component={prop.component}
key={key}
></Route>
);
}
}
return null;
})}
<Redirect from="/admin" to="/admin/dashboard" />
</Switch>
);