react入门,使用create-react-app搭建一个todolist-dome。

第一步:安装create-react-app脚手架

1 npm install -g create-react-app

第二步:创建你的todo-list项目

1 // 在命令行输入如下命令
2 create-react-app todo-list
3 //注意npm命名限制,项目名称不能含有大写字母。

第三步:清除项目中不必要的文件

1 /**
2 - src目录中的:App.css, App.test.js, logo.svg, serviceWorker.js文件
3 - public目录中的: manifest.json文件
4 - 其中manifest.json,serviceWorker.js属于pwa的配置文件,有兴趣可以了解一下。
5 - pwa 让网页写好以后,用户访问了一次之后,就可以把我们的网页当作app来用,可以不用联网。
6 - 在手机上或者电脑桌面上通过点击快捷方式来打开页面。
7 - 他的图标和快捷方式是通过public中manifest.json去定义的
8 */

第四步:之前删除的文件在剩下的文件有引入使用,现在将其删除

 1 /**
 2 - App.js删除下列代码注释部分
 3 */
 4
 5 import React, { Component }from ‘react‘;
 6 // import logo from ‘./logo.svg‘;
 7 // import ‘./App.css‘;
 8
 9 class App extends Component {
10   render(){
11     return (
12       {
13         /*
14       <div className="App">
15         <header className="App-header">
16           <img src={logo} className="App-logo" alt="logo" />
17           <p>
18             Edit <code>src/App.js</code> and save to reload.
19           </p>
20           <a
21             className="App-link"
22             href="https://reactjs.org"
23             target="_blank"
24             rel="noopener noreferrer"
25           >
26             Learn React
27           </a>
28         </header>
29       </div>
30       */
31       }
32       <div>
33       hello react
34       </div>
35
36     );
37   }
38 }
39 export default App;
 1 /**
 2  index.js 删除一下注释部分
 3 */
 4 import React from ‘react‘;
 5 import ReactDOM from ‘react-dom‘;
 6 // import ‘./index.css‘;
 7 import App from ‘./App‘;
 8 //import * as serviceWorker from ‘./serviceWorker‘; // pwa 引入
 9
10 ReactDOM.render(<App />, document.getElementById(‘root‘));
11
12 // If you want your app to work offline and load faster, you can change
13 // unregister() to register() below. Note this comes with some pitfalls.
14 // Learn more about service workers: https://bit.ly/CRA-PWA
15 // serviceWorker.unregister(); // pwa 使用
<!-- public中的index.html文件,删除以下注释部分代码 -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="logo192.png" />
    <!--
      manifest.json provides metadata used when your web app is installed on a
      user‘s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <!--
      <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    -->
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>todo-list</title> <!-- 更改网页标题 -->
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html>

第五步:项目目录解析

/**
- yarn.lock -- 包锁文件
- README.MD -- 项目介绍
- package.json -- node的包文件
- .gitignore -- 使用git的时候可以将不想上传到git的文件在此处标记
- node_modules -- 项目依赖包
- index.html 项目首页模版
- favicon.ico 网页图标
- index.js 入口js文件
- app.js 万年老二组件
*/

第六步:jsx语法

/**
- jsx语法规定,在return中的最外层只能含有一个标签。
- 为此你可以使用div也可以使用react提供的Fragment占位符,他其实也是一个组件。
- 在js中写html标签。就称为jsx语法
- render()函数中return => html标签或者组件名加括号,组件必须以大写字母开头
- jsx中使用变量,需要使用{}包裹
- 现在我们将App.js改造成如下代码。
- 通过npm run start 启动你的项目
*/
    import React, { Component, Fragment } from ‘react‘;
    class App extends Component {
      render(){
        return (
          <Fragment>
            <div >
            <input/><button>提交</button>
            </div>
            <ul>
              <li>react</li>
            </ul>
          </Fragment>
        );
      }
    }
export default App;

第七步:react的响应式思想和事件绑定

7.1定义数据

/**
- 之前我们已经将todo-list的结构搭好了。现在需要实现功能。
- 不要直接操作dom
- 通过改变数据改变dom
- 此时我们需要准备两组数据,1组数据存储input里面的值,1组数据存储列表中的值。
- 如何定义数据?
  - 一个类必定有一个构造函数,并且他是最先执行的函数,我们可以将数据存在这个构造函数中
  - constructor 即为App类的构造函数,构造函数中有state属性,他是用来存放这个类的变量的。
  - 因此数据就定义在state中。
  - constructor 构造函数还有一个super()方法,他可以帮助App类调用他的父类(Component)的属性。
- 使用箭头函数不然this指向出错
- 只能通过setState方法去改变state中的变量
- 代码如下
*/
    import React, { Component, Fragment }from ‘react‘;
    class App extends Component {
      constructor(props){
        super(props);
        this.state = {
          inputValue: ‘‘,// 用来存储 input框中的 value值。
          list:[] // 用来存储 每一个li的 value值。
        }
      }
      render(){
        return (
          <Fragment>
          <div>
            <input/>
            <button>提交</button>
          </div>
          <ul>
            <li>react</li>
          </ul>
          </Fragment>
        );
      }
    }
    export default App;

7.2绑定数据

 1 /**
 2 - 我们上面已经定义好了数据,现在将数据绑定到对应的dom上
 3 - 这样方便我们通过数据改变dom
 4 - react jsx语法中,绑定数据到dom上,使用{} 包裹。 -- value = {this.state.inputValue}
 5 - 列表数据绑定也是一样,在{}中写js表达式,我们可以通过es5的map函数遍历list数组获得item值,和他的下标
 6 - 然后通过return返回一个li标签,返回之前,将item绑定到li的value值,将index作为li的key
 7 - 注意的是,实际开发中将index作为key值是一个错误的做法。
 8 */
 9     import React, { Component, Fragment }from ‘react‘;
10
11     class App extends Component {
12       constructor(props){
13         super(props);
14         this.state = {
15           inputValue: ‘‘,// 用来存储 input框中的 value值。
16           list:[‘西瓜‘,‘苹果‘] // 用来存储 每一个li的 value值。
17         }
18       }
19       render(){
20         return (
21           <Fragment>
22           <div>
23             <input value = {this.state.inputValue} />
24             <button>提交</button>
25           </div>
26           <ul>
27             {
28               this.state.list.map((item, index) => {
29                 return (
30                   <li key={index}>
31                     {item}
32                   </li>
33                 )
34               })
35             }
36           </ul>
37           </Fragment>
38         );
39       }
40     }
41     export default App;

第八步:react的事件绑定

 1 /**
 2 - 我们现在需要绑定input的onChange事件,以此达到input的value值的变化和我们数据inputValue变化一致
 3 - react的事件绑定和原生的区别就是第二个单词首字母要大写,onChang
 4 - 在onChange事件中绑定handleInputChange()方法,传入事件对象,获取target值,他的value就是当前input的value值
 5 - 再通过this.setState()方法区改变组件中inputValue的值。
 6 - 要注意的是,react中只能通过setState方法改变state中的属性。
 7 */
 8       import React, { Component, Fragment }from ‘react‘;
 9
10     class App extends Component {
11       constructor(props){
12         super(props);
13         this.state = {
14           inputValue: ‘‘,// 用来存储 input框中的 value值。
15           list:[‘西瓜‘,‘苹果‘] // 用来存储 每一个li的 value值。
16         }
17       }
18       handleInputChange = (e) => {
19         this.setState({
20           inputValue: e.target.value
21         })
22         console.log(e.target)
23       }
24       render(){
25         return (
26           <Fragment>
27           <div>
28             <input
29             onChange = {this.handleInputChange}
30             value = {this.state.inputValue} />
31             <button>提交</button>
32           </div>
33           <ul>
34             {
35               this.state.list.map((item, index) => {
36                 return (
37                   <li key={index}>
38                     {item}
39                   </li>
40                 )
41               })
42             }
43           </ul>
44           </Fragment>
45         );
46       }
47     }
48     export default App;

第九步:如何实现Todolis的增删功能

 1 /**
 2 - 增加思路  在input框中输入要添加的字段,点击提交,提交绑定一个方法,将inputValue的值添加到list数组中
 3 - 删除思路  在每一个li中绑定点击事件,在点击的时候,传入当前li的下标,在事件方法中通过下标删除list中的对应元素
 4 - 要注意的时,在传入index的时候我尝试过直接在方法名后面传入,但是会报错,改在bind()方法中第二个参数传入,就没有问题了
 5 - state中的属性数据,只能通过this.setState({})方法修改,不能直接修改。
 6 - 在使用splice的时候踩了一个坑,list = list.splice(index, 1)
 7 - 这是一行错误代码,这样赋值,list等于是你删除的哪个元素组成的数组,splice会改变原数组,返回被删除的数组。无需再赋值
 8 */
 9     import React, { Component, Fragment } from ‘react‘;
10     class App extends Component {
11
12       // 定义数据,一个类必定有一个构造函数,他是最先执行的函数
13       constructor(props){
14         super(props); // App继承Component类,所以要通过super(props)调用他的父类的属性
15         this.state = {
16           inputValue: ‘‘, // input框的value
17           list: [] // 列表的数据
18         }
19       }
20       handleInputChange = (e) => { // 使用箭头函数不然this指向出错
21         this.setState({ // 只能通过setState去改变state中的变量
22           inputValue : e.target.value
23         })
24         console.log(e.target)
25       }
26       // 增加方法
27       handleBtnClick = () => {
28         this.setState({
29           list : [...this.state.list, this.state.inputValue],
30           inputValue: ‘‘
31         })
32       }
33       // 删除方法
34       handleItemDelet = (index) => {
35         console.log(index)
36         let list = [...this.state.list];
37         // list = list.splice(index, 1) // 这是一行错误代码,这样赋值,list等于是你删除的哪个元素组成的数组
38         list.splice(index, 1)
39         console.log(list)
40         this.setState({
41           list : [...list]
42         })
43       }
44       render(){
45         return (
46           <Fragment>
47             <div >
48             <input
49             value = { this.state.inputValue } // 数据相应绑定
50             onChange = { this.handleInputChange } // 事件绑定
51             />
52             <button
53             onClick = { this.handleBtnClick }
54             >提交</button>
55             </div>
56             <ul>
57               {
58               this.state.list.map((item, index) => {
59                 return <li key={index} onClick = { this.handleItemDelet.bind(this, index) }>{item}</li>     // 实际编程之中使用index做key值是一个非常不好的习惯
60               })
61               }
62             </ul>
63           </Fragment>
64         );
65       }
66     }
67
68 export default App;

第十步:jsx语法的一点补充

 1 /**
 2 - 注释用大括号包裹,单行注释要换行
 3 - 添加样式使用 className ,class会被解析成类
 4 - dangerouslySetInnerHTML = {js表达式}
 5 - dangerouslySetInnerHTML = {{ __html: item }} 多一个花括号表示一个js对象
 6 - // 如果需要显示input框中内容中的标签效果 就这么写。但是这样写容易造成xss攻击 对应的标签中就不需要写item了
 7 - lable标签 使用htmlFor引入到指定标签中
 8 */
 9   render(){
10     return (
11       <Fragment>{/* 他其实是一个组件 */ }
12         <div >
13         <lable htmlFor = "insertArea">输入内容</lable>
14         <input
15         id = ‘insertArea‘
16         className = ‘input‘
17         value = { this.state.inputValue } // 数据相应绑定
18         onChange = { this.handleInputChange } // 事件绑定
19         />
20         <button
21         onClick = { this.handleBtnClick }
22         >提交</button>
23         </div>
24         <ul>
25           {
26           this.state.list.map((item, index) => {
27             return (
28             <li
29             key={index}
30             onClick = { this.handleItemDelet.bind(this, index) }
31             dangerouslySetInnerHTML = {{ __html: item }} // 如果需要显示input框中内容中的标签效果 就这么写。但是这样写容易造成xss攻击
32             >
33
34             </li>) // 实际编程之中使用index做key值是一个非常不好的习惯
35           })
36           }
37         </ul>
38       </Fragment>
39     );
40   }

总结

1 /**
2 系统的学习能让自己在工作中避免很多低级错误。
4 */

原文地址:https://www.cnblogs.com/boye-1990/p/11364246.html

时间: 2024-10-07 12:16:20

react入门,使用create-react-app搭建一个todolist-dome。的相关文章

springboot入门(一)--快速搭建一个springboot框架

原文出处 前言在开始之前先简单介绍一下springboot,springboot作为一个微框架,它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架的应用程序,总的来说springboot不是为了要替代Spring IO平台上众多的项目也不是spring的升级,它只是提供一种不同的开发体验,一种几乎没有配置文件的快速开发的框架,让你体验一下java做到接近ruby on rails开发速度的感觉. 正文说了一堆废话直接进入正文,接下来将体验到没

React漫漫学习路之 利用Create React App命令创建一个React应用

所谓万事开头难,本文旨在为初探React的同学,建立第一个最基本的react应用. Create React App是Facebook官方的一个快速构建新的 React 单页面应用的脚手架工具,它可以帮你配置开发环境,以便你可以使用最新的 JavaScript 特性,还能提供很棒的开发体验,并为生产环境优化你的应用.(如果你使用过vue-cli构建vue应用,那么此处可类比) 话不多说,直接开始. 安装 全局安装create-react-app npm install -g create-rea

react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)

react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redux-saga的核心配置会加以讲解,通过这个项目,可以系统的了解react技术栈的主要知识,避免搭建一次后面就忘记的情况. 从webpack开始 思考一下webpack到底做了什么事情?其实简单来说,就是从入口文件开始,不断寻找依赖,同时为了解析各种不同的文件加载相应的loader,最后生成我们希望的

如何使用脚手架搭建一个react项目

1.准备工作: 首先要知道,搭建一个react项目总是需要安装node.js和npm的,未安装的请移步node.js官网:https://nodejs.org/en/ 检测是否安装成功:npm -v 和node -v 2.npm安装脚手架 执行命令npm install create-react-app 3.使用npx和脚手架创建项目my_app,这个过程可能需要几分钟,请耐心等待 npx create-react-app my_app 这里用到了npx,就是可以让你不用全局安装create-r

React Native 简介:用 JavaScript 搭建 iOS 应用 (1)

[编者按]本篇文章的作者是 Joyce Echessa--渥合数位服务创办人,毕业于台湾大学,近年来专注于协助客户进行 App 软体以及网站开发.本篇文章中,作者介绍通过 React Native 框架构建一个示例应用的开发过程,使得网络技术和移动开发碰撞出绚丽火花,本文系 OneAPM 工程师编译整理: 我们已经了解像 Titanium 和 PhoneGap 等框架,它们能让开发者用 Web 技术构建移动应用.这是一个优势,支持开发者使用原先网络和移动开发的相关技术.不仅如此,相同的代码库经过

为React Native开发写的JS和React入门知识

来自Leo的原创博客,转载请著名出处 我的stackoverflow 前言 想来想去,还是需要写一篇文章来介绍下JavaScript和React的基本知识.最初开发ReactNative的时候,完全没接触过React,大学那会简单学了点JS.毕业后一直在某五百强外企上班.做的东西也乱七八糟的,搞过大数据,搞过物联网,不过看我博客的同学应该知道,我对iOS和Android还是比较喜欢的.所以,博客都是写的都是移动端的东西.好像扯的有点多了,本文的目的就是为了那些JS和React小白提供一个快速入门

Flux --&gt; Redux --&gt; Redux React 入门 基础实例使用

本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推荐使用 ES6+React+Webpack 的开发模式,但Webpack需要配置一些东西,你可以先略过,本文不需要Webpack基础 入门,只是一些基础概念和用法的整理,更完整的内容推荐去看看文档,英文,中文 (不过我个人认为,官方文档的例子相对来说太复杂了,很难让新手马上抓住重点) (官方的例子正

React 入门实例教程

React 入门实例教程 作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 由于 React 的

(转)React 入门实例教程

作者: 阮一峰 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Native 发布,结果一天之内,就获得了 5000 颗星,受瞩目程度可见一斑. React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西很好用,就在2013年5月开源了. 由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非