Closed10
マッスルオンライン
Reactの開発環境をdockerで立ち上げる
下記のようにコマンドをうち、Reactをインストールする。
npx create-react-app .
Reactのファイル構造
index.js→app.jsが読み込まれる形となっている。
React-routerv6
app.jsにルートの設定を記述する。
<BrowserRouter>
<Routes>
<Route path={`/`} element={<Home />} />
<Route path={`/about`} element={<About />} />
</Routes>
</BrowserRouter>
応用
react-routerとRender Propsを一緒にどうやって実現するかわからなかった。
<Route path={`/`} element={<Home {...props} loggedInStatus={loggedInStatus}/>} />
新規登録のやり方
- 新規登録フォームの作成
<form onSubmit={handleSubmit}>
<input
type="email"
name="email"
placeholder="メールアドレス"
value={email}
onChange={event=> setEmail(event.target.value)}
/>
<input
type="password"
name="password"
placeholder="パスワード"
value={password}
onChange={event=> setPassword(event.target.value)}
/>
<input
type="password"
name="password_confirmation"
placeholder="確認用パスワード"
value={passwordConfirmation}
onChange={event=> setPasswordConfirmation(event.target.value)}
/>
<button type="submit">登録</button>
</form>
- onsubmit関数の作成
onst handleSubmit =(event)=>{
console.log(email)
console.log(password)
axios.post("http://localhost:5000/signup",
{
user:{
email:email,
password:password,
password_confirmation: passwordConfirmation
}
},
{ withCredentials: true } //cookieを含むか
).then(res=>{ //ユーザー作成成功
console.log("registration res", res)
}).catch(err=>{//ユーザー作成失敗
console.log("registration res", err)
})
event.preventDefault()
}
ログインしている場合、pathを通す
下記のようにtokenがあるかないかで判別を行う
<BrowserRouter>
<Routes>
<Route path={`/`} element={<Top />} />
<Route path={`/signup`} element={<Signup />}/>
<Route path={`/signin`} element={<Signin setToken={setToken}/>}/>
{/* トークンがない場合 */}
{!token && token!=="" &&token!== undefined?
<Route path={`/signin`} element={<Signin setToken={setToken}/>}/>
:(
<>
<Route path={`/home`} element={ <Home token={token} />}/>
<Route path={`/battlelog`} element={ <Battlelog token={token} setToken={setToken}/> }/>
<Route path={`/mypage`} element={ <Mypage token={token} />} />
</>
)}
</Routes>
</BrowserRouter>
参考記事
ログイン時にtokenを保存
const handleSubmit =(event)=>{
axios.post("http://localhost:5001/signin",
{
user:{
email:email,
password:password,
}
}
).then(res=>{ //ユーザー作成成功
props.setToken(res.data.data.token)//josnからtoken取得
if (res.data.code===1){
console.log("ログイン成功しました")
console.log(res.data.data.token)
navigate('/home')
}
}).catch(err=>{//ユーザー作成失敗
console.log("registration res", err)
console.log(err.response)
console.log(err.response.status)
console.log(err.response.headers)
})
setEmail("")
setPassword("")
event.preventDefault()
}
ログインボタンを押した際に、handleSubmitメソッドを発火。
・api先を指定
・送るデータを指定
・thenで props.setToken(res.data.data.token)
→josnからtoken取得する
if文でapiの成功したステータスとres.data.codeがあっていた場合、
ホームに遷移する
リダイレクトするやり方
import { useNavigate,Link } from 'react-router-dom';
const navigate=useNavigate()
navigate('/home')
こうすることで http://localhost/home に遷移することができる。
tokenを保存できていないバク
import {useState} from "react"
const useToken=()=>{
//ローカルストレージからトークンの取得
const getToken=()=>{
const userToken=localStorage.getItem('token');
return userToken && userToken //トークンが存在する場合にのみトークンを返す
}
const [token,setToken]=useState(getToken())
//トークンを保存する
const saveToken=(userToken)=>{
localStorage.setItem('token',userToken)
setToken(userToken);
}
//トークンの削除
const removeToken=()=>{
localStorage.removeItem("token")
setToken(null);
}
return {
setToken: saveToken,
token,
removeToken
}
}
export default useToken;
useToken.jsを作成し、
・apiからのtokeの取得
・tokenの保存
・tokenの削除
をおこない
それをreturn に返す 処理をおこなっている
がここでは間違いがなかった。
ログイン時にミスがないか確認
const handleSubmit =(event)=>{
axios.post("http://localhost:5001/signin",
{
user:{
email:email,
password:password,
}
}
).then(res=>{ //ユーザー作成成功
props.setToken(res.data.data.token)//josnからtoken取得
if (res.data.code===1){
console.log("ログイン成功しました")
console.log(res.data.data.token_auth)
navigate('/home')
}
}).catch(err=>{//ユーザー作成失敗
console.log("registration res", err)
console.log(err.response)
console.log(err.response.status)
console.log(err.response.headers)
})
setEmail("")
setPassword("")
event.preventDefault()
}
となっていた。
間違っていたのは、
props.setToken(res.data.data.token_auth)//josnからtoken取得
ここの部分で、
resの中身を確認したところ
data{
token: ~~~~~~~~
}
となっているので、
props.setToken(res.data.data.token)//josnからtoken取得
と指定することで対処することができた。
apiから戦歴を取得し、表示する方法
useeffectを利用し、
- トークンをpostし、tokenが同じ場合、値を保存する。
- その保存した値を、表示する。
エラー 表示はすることができたが、ホーム画面から対戦ログ画面に遷移すると表示されない
仮説
・画面遷移時にuseeffectが起動するよりも先に画面描画されるため、エラーが起きる
結果
・useStateの初期値がミスしていたため、エラーが起きていた。
const [userlog,setUserlog]=useState()
const [userlog,setUserlog]=useState([])
Loading画面の追加
react-slickを使いスライドショーの作成
import Slider from "react-slick";
import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";
const Loading=()=>{
const settings = {
dots: true,
infinite: true,
speed: 1000,
slidesToShow: 1,
slidesToScroll: 1
};
return(
<>
<div className={classes.telopContainer}>
<p className={classes.telopText}>画面を横にしてお待ちください</p>
</div>
<Slider {...settings}>
<div >
<img src={`${process.env.PUBLIC_URL}/img/image1.png`} alt="a" className={classes.img}/>
</div>
<div>
<img src={`${process.env.PUBLIC_URL}/img/image2.png`} alt="a" className={classes.img}/>
</div>
<div>
<img src={`${process.env.PUBLIC_URL}/img/image3.png`} alt="a" className={classes.img}/>
</div>
<div>
<img src={`${process.env.PUBLIC_URL}/img/image4.png`} alt="a" className={classes.img}/>
</div>
<div>
<img src={`${process.env.PUBLIC_URL}/img/image5.png`} alt="a" className={classes.img}/>
</div>
</Slider>
<div className={classes.footerContainer}>
</div>
</>
)
}
react-webcameraからのリアルタイム映像を画像として処理する
このスクラップは2022/10/06にクローズされました