質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

406閲覧

React.jsでバックエンドのJsonの値が変わる時に 写真の表示を切り替えたい

Tomato_leaf

総合スコア173

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/09/12 08:35

編集2022/09/12 08:37

前提

現在、家の電気機器をWebでコントールできるシステムを作っています。
Backendはできていて、
バックエンドの状態によって
アイコンの切り替えをしたいと考えています。

実現したいこと

バックエンドのJsonの値が変わる時に
アイコンの表示を切り替えたい

発生している問題・エラーメッセージ

Onclickの箇所をクリックしたときに
バックエンドのJsonの値は変わっているが
写真の表示切り替えが発生しない

イメージ説明

該当のソースコード

React.js

1 2import React, { useState, useEffect, useCallback, onClick} from 'react'; 3import axios from 'axios'; 4 5import ic_locked from "../../images/icons/ic_locked.png" 6import ic_unlockeds from "../../images/icons/ic_unlockeds.png" 7 8const LockDetail = () => { 9 10 const [lock, setLock] = useState([]); 11 12 13 const Unlock = async(data) => { 14 await axios.post('xxx.com/unlock', 15 { 16 entity_id: entity_id, 17 }, 18 { 19 headers: { 20 'Content-Type': 'application/json', 21 'Authorization': `Bearer ${cookies.get('accesstoken')}` 22 }, 23 }) 24 .then(result => { 25 console.log(result.data); 26 console.log('Unlocked!'); 27 alert('Unlocked!'); 28 }) 29 .catch(err => { 30 console.log(err); 31 console.log('Unlocked Missed!'); 32 }); 33 } 34 35 36 const Lock = async(data) => { 37 await axios.post('xxx.com/lock', 38 { 39 headers: { 40 'Content-Type': 'application/json', 41 'Authorization': `Bearer ${cookies.get('accesstoken')}` 42 }, 43 }) 44 .then(result => { 45 console.log(result.data); 46 console.log('Locked!'); 47 alert('Locked!'); 48 }) 49 .catch(err => { 50 console.log(err); 51 console.log('Locked Missed!'); 52 }); 53 } 54 55const getDevices = async(data) => { 56 await axios.get('xxx.comm/device_list', 57 { 58 headers: { 59 'Content-Type': 'application/json', 60 'Authorization': `Bearer ${cookies.get('accesstoken')}` 61 }, 62 }) 63 .then(result => { 64 console.log(result.data) 65 setLock(result.data.attributes.lock); 66 }) 67 .catch(err => { 68 console.log(err); 69 }); 70} 71 72useEffect(() => { 73 getDevices(); 74 }, []); 75 76 return ( 77 <div className="container"> 78 <div className="row mx-auto text-center"> 79 <> 80 {lock.map((item,i) => 81 <div key={i} className="col-12"> 82 <div className="box"> 83 <p>Lock Status</p> 84 {item.state == "Locked" ? 85 <img className="" src={ic_locked} /> 86 : 87 <img className="" src={ic_unlockeds} /> 88 } 89 90 <p className="state">{item.state}</p> 91 </div> 92 93 {item.state == "Locked" ? 94 <img className="" src={ic_unlockeds} onClick={Lock}/> 95 : 96 <img className="" src={ic_locked} onClick={Unlock}/> 97 } 98 99 </div> 100 )} 101 102 </> 103 </div> 104 105 </div> 106 ); 107} 108export default LockDetail;

Json

1 { 2 "state": "Locked", 3 },

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

getDevicesではsetLockが呼び出されているため、Lockのstateが変更され
最新のものになっていますが、
onClickで呼び出される、Lock,Unlockではstateが変更される文面がないため、
console上でのデータが正しくとも、画面は変わらないという状況になっているように思えます。

Lock,Unlockのthenのところでstateを更新してあげてください

投稿2022/09/12 10:21

sk-sora--ypi

総合スコア528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomato_leaf

2022/09/13 07:02

thenのところにgetDevices()を入れ込むとうまく行きました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問