作りたいもの
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.
回答1件
あなたの回答
tips
プレビュー