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

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

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

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

Q&A

解決済

1回答

1695閲覧

React.jsでReactHooksを使いたい

butsuli_shine

総合スコア29

React.js

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

0グッド

0クリップ

投稿2021/01/03 03:11

編集2021/01/03 03:38

作りたいもの

Todoリストと電卓をフロントエンドのみで実装したい.
Reactやjavascriptの初心者なので教えていただきたいです.

考えているコンポーネント構造

app - todo - form - list -calclater

わからないこと

  • ReactHooksを呼び出すのはトップレベルのファイルでないといけない(App.jsxでしか呼び出せない)のでstate管理をしたいTodo.jsxでuseStateを呼び出せない

  • そもそもこのような構造をReactで作れないのか

コード

App.jsx

js

1import React from "react"; 2import {BrowserRouter as Router, Route} from 'react-router-dom'; 3import Navbar from "./Navbar"; 4import Home from './Home'; 5import Todo from './Todo'; 6 7const App = () => { 8 return( 9 <div className="App"> 10 <Router> 11 <div> 12 <Navbar/> 13 <Route exact path="/" component={Home}/> 14 <Route path="/Todo" component={Todo}/> 15 </div> 16 </Router> 17 18</div> 19 20 ) 21} 22 23export default App;

Home.jsx

js

1const Home = () => { 2 return( 3 <h1> HOMEです。</h1> 4 ) 5}; 6 7export default Home; 8

Navbarは省略します。

Todo.jsx

js

1import { useState } from 'react' 2import Form from 'Form'; 3import List from 'List'; 4const [todoList, setTodoList] = useState([]); 5const Todo = () => { 6 const addTodoList = (Title, Content) => { 7 setTodoList(todoList.concat({"title": Title, "content": Content})) 8 } 9 10 const deleteTodoList = (index) =>{ 11 setTodoList((item => todoList[index] !== item)) 12 } 13 14 return ( 15 <div className="p-3 mb-2 bg-info text-white"> 16 <Form addTodoList={addTodoList}/> 17 <List todos={todoList} deleteTodoList={deleteTodoList}/> 18 </div> 19 ) 20} 21 22export default Todo; 23

Form.jsx

js

1const Form = (props) => ( 2 <form onSubmit={props.addTodoList}> 3 <div className="form-group row"> 4 <label className="col-sm-2 col-form-label">Your todo:</label> 5 <input name="title" type="text" className="siimple-input" /> 6   7 <input type="submit" value="Add" className="btn btn-secondary btn-sm" /> 8 </div> 9 </form> 10); 11 12export default Form; 13

List.js

js

1 2import React from "react"; 3 4let style = { maxWidth: "700px" }; 5 6const List = (props) => ( 7 <ul className="siimple-list"> 8 {props.todos.map((todo, i) => { 9 return ( 10 <div className="container"> 11 <li 12 key={i} 13 className="list-group-item list-group-item-info" 14 style={style} 15 > 16 {todo.title}{" "} 17 <div className="float-right"> 18 <button type="button" className="btn btn-danger btn-sm" onClick={() => props.deleteTodoList(i)}>delete</button> 19 </div> 20 </li> 21 </div> 22 23 ); 24 })} 25 26 </ul> 27); 28 29export default List; 30

styleはほぼbootstrapに任せてます。
よろしくお願いします

追記

Todo.jsxで以下のようなエラーが出ます。

React Hook "useState" cannot be called at the top level. React Hooks must be called in a React function component or a custom React Hook function.

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

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

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

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

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

hoshi-takanori

2021/01/03 03:31

「ReactHooksを呼び出すのはトップレベルのファイルでないといけない」なんてことはありません。各関数コンポーネントで使えます。関数コンポーネントのトップレベルで呼び出す必要があるというのを誤解したのでは。todo と calculator が互いに情報のやり取りをしないなら、それぞれローカルな state を持てばいいだけですね。
butsuli_shine

2021/01/03 03:37

ありがとうございます。 そうなのですね。 よく理解できていないのですが質問の追記の方でエラーメッセージを張り付けるのでどういう意味かよくわからないので、教えていただけたら幸いです。
guest

回答1

0

ベストアンサー

useStateなどのHooksは、関数コンポーネントの中に書く必要があります。ファイルのトップレベルに置いても動きません。

投稿2021/01/03 03:40

maisumakun

総合スコア146018

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

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

butsuli_shine

2021/01/03 03:44

ありがとうございました、関数内で呼び出さないといけないということに気づいていませんでした。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問