从0开始学 react

1 webpack

mkdir chong0kaishixuereact
cd chong0kaishixuereact
npm init
npm install webpack --save-dev
npm install -save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react
npm install --save react react-dom
touch index.html
touch component/component1.js
touch main.js
 ```

cat webpack.config.js

var config = {
   entry: './main.js',

   output: {
      path:__dirname,
      filename: 'index.js',
   },

   devServer: {
      inline: true,
      port: 3000
   },

   module: {
      loaders: [ {
         test: /\.js?$/,
         exclude: /node_modules/,
         loader: 'babel-loader',

         query: {
            presets: ['es2015', 'react']
         }
      }]
   }

}

cat main.js

import React from 'react';
import ReactDOM from 'react-dom';
import Component1 from './component/component1';
 ReactDOM.render(<Component1 />, document.getElementById('index'))

cat index.html

<!DOCTYPE html>
<html>

   <head>
      <meta charset = "UTF-8">
      <title>React App </title>
   </head>

   <body>
      <div id = "index"></div>

   </body>

</html>
 <script src = "index.js"></script>

cat component/component1.js

import React from 'react';

export default class Component1 extends React.Component {
   render() {
      return (
         <div>
            Hello <br />
           component1
         </div>
      );
   }
}

进入项目根目录

webpack 输出 index.js文件

然后运行 npm start

浏览器显示 “component1” 调用组件成功

问题1 调试发现,npm start能编译通过,但WEB空白,中间的错在终端看不出,

解决方法,在chrome devtools 中查

问题2 为何直接 npm start 不能编译成 index.js? 但这个时候没有index.js , index.html 显示还是正常的

2 ES6

1 箭头函数

cat component/component1.js

import React from 'react';

export default class Component1 extends React.Component {

   render() {
   //最简单的 function,一个参数 a
    var foo = a => a ;
   console.log(foo('hihi'));
   //没有参数的直接是空括号
   var foo2 =() =>{
   alert('haha');
   }
   foo2();
   //多个参数要用到小括号,参数间逗号间隔,例如两个数字相加
   var add = (a,b) => a+b;
   console.log(add(1,2));
   //返回对象时需要用小括号包起来,因为大括号被占用为代码块了
   var getHash =() =>{
   return(
   {
   name:'zhangsan',
   age:10
   });
   };
   console.log(getHash());

   //点击事件,
   document.addEventListener('click',event=>{console.log(event);});
      return (

         <div>
           <br />
           component1
         </div>
      );
   }

}

3 类class

vi employee.js

 class Employee{
   //构造 function
   constructor(id,name,job){
   this.id = id;
   this.name = name;
   this.job = job;
   }
   //注意,上面无分号间隔
   getMessage(){
   return this.id + 
   "=>" 
   + this.name
   +"=>"
   +this.job;
   }
}
   //export 是导出类,其他地方可以直接 import 这个类
   //default 只能用一次,是只是当前页用一次,还是其他页也不能用了?
   export default Employee;

vi component/component1.js

import React from 'react';
import  Employee from '../employee.js';


export default class Component1 extends React.Component {

   render() {
   var e1 = new Employee('001','jack','cooker');
   console.log(e1.getMessage());


      return (

         <div>
           <br />
           component1
         </div>
      );
   }

}

常量const和 let 声明

vi component/component1.js

import React from 'react';
import  Employee from '../employee.js';


export default class Component1 extends React.Component {

   render() {
   var e1 = new Employee('001','jack','cooker');
   console.log(e1.getMessage());

    //    {
//  let a = 10;
//  var b = 11;

//  }


// console.log(a);
// console.log(b);

for(let i =0;i<10;i++){}
for(var k=0;k<10;k++){}

//console.log(i);
console.log(k);

      return (

         <div>
           <br />
           component1
         </div>
      );
}
}

JSX

cat main.js

import React from 'react';
import ReactDOM from 'react-dom';

import Component1 from './component/component1';
import Component2 from './component/component2';



  // ReactDOM.render(<Component2 />, document.getElementById('index2'))
 //ReactDOM.render(<Component1 />, document.getElementById('index'))
// ReactDOM.render(
//     <div>
//       <h1>{1+1}</h1>
//     </div>
//     ,
//     document.getElementById('index')


// );


  var arr =[
   <h1> hi</h1>,
   <h2> react is awesome</h2>

   ];

   ReactDOM.render(
   <div>{arr}</div>,document.getElementById('index'));

notice:

Warning: Each child in an array or iterator should have a unique "key" prop. Check the top-level render call using <div>. See https://fb.me/react-warning-keys for more information.
    in h1 我网上查了下,知道是要用 key,但查的例子没办法参考 ,暂时略过,各位留意这里的优化和提高,我自己也要注意以后改正

props和省略号语法

vi component/component2.js

import React,{Component} from 'react';
import ReactDOM from 'react-dom';


// class Component2 extends React.Component {
//    render() {
//    //    //最简单的 function,一个参数 a
//    //  var foo = a => a ;
//    // console.log(foo('hihi'));
//    // //没有参数的直接是空括号
//    // var foo2 =() =>{
//    // alert('haha');
//    // }
//    // foo2();
//    // //多个参数要用到小括号,参数间逗号间隔,例如两个数字相加
//    // var add = (a,b) => a+b;
//    // console.log(add(1,2));
//    // //返回对象时需要用小括号包起来,因为大括号被占用为代码块了
//    // var getHash =() =>{
//    // return(
//    // {
//    // name:'zhangsan',
//    // age:10
//    // });
//    // };
//    // console.log(getHash());

//    // //点击事件,
//    // document.addEventListener('click',event=>{console.log(event);});



//       return (
//          <div>
//             Component2<br />

//          </div>
//       );
//    }
// }





//声明一个组件类,叫 MyTitle
class Component2 extends Component{
    show(){
        console.log(this.props.title);
        console.log(this.props.contents);
        console.log(this.props.name);
    }

    //渲染组件:一个按钮,并可以点击
    //注意 bind(this)的写法,这是 JSX 语法要的
    //如果怕麻烦也可以用箭头 function

    render(){
        return(<button onClick={this.show.bind(this)}>click</button>);

    }
}

//要向组件传递的数据 

var data ={
    title:'this is a little',
    contents:'this is contents'

};
ReactDOM.render(
<Component2 {...data} name ={'my name'} />,
document.getElementById('index')
);

export default Component2;

这里写图片描述
步骤是:1 声明组件: ES6的类声明
2 渲染组件: render用法
渲染方法包括两个参数,一个是组件名称,一个是页面的 id,进一步得想,index.html可以有多个 id吗?不同的 component可以定位不同的 id,然后在 index.html上显示吗?还是main.js是一个大的组件,由很多小组件组合而成,
这就不是 SPA了,多页面这里如何处理

this.props.children

cat component/NodeList.js

'use strict';
import React,{Component} from 'react';
import ReactDOM from 'react-dom';
//声明一个组件类,叫 NodeList
class NodeList extends Component{
    render(){
        return(
        <ul>
            {
                //遍历 this.props.children 节点
            React.Children.map(this.props.children,function(child){
                    return(<li>{child}</li>);
                })
            }
            </ul>
            );
                        <NodeList>
<span> hello</span>
<span> world</span>
</NodeList>;
    }
}

export default NodeList;

cat main.js

import React,{Component} from 'react';
import ReactDOM from 'react-dom';
 import NodeList from './component/NodeList';

 ReactDOM.render(
<NodeList>
<span> hello</span>
<span> world</span>
</NodeList>
    ,document.getElementById('index'));i

state状态机 和 refs

cat component/inputstate2.js

'use strict';
import React,{Component} from 'react';
import ReactDOM from 'react-dom';


//声明一个组件类,叫 Search
class Search extends Component{
    checkSth(){
        var inputValue = this.refs.myInput.value;
        alert(inputValue);
    }


    render(){
        return(
<div>
<input type = "text" ref="myInput" />
<button onClick ={this.checkSth.bind(this)}>获取内容</button>
</div>
            );

    }
}

// ReactDOM.render(

// document.getElementById('index')
// );

export default Search;

cat main.js

import React,{Component} from 'react';
import ReactDOM from 'react-dom';
import Search from './component/inputstate2';

  ReactDOM.render(
<Search/>
    ,document.getElementById('index'));
![这里写图片描述](https://img-blog.youkuaiyun.com/20170204145612982?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2lyZW5j/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

#综合案例
cat component/box.js 
'use strict';
import React,{Component} from 'react';
import ReactDOM from 'react-dom';

//小部件,渲染为 UL 列表
class  Items extends Component{
        render(){
        var arrLi =[];
        for(let i=0;i<this.props.info.length;i++){
            //注意,这不是拼接字符串
            arrLi.push(<li key={i}> {this.props.info[i]}</li>);
        }
        return(<ul>{arrLi}</ul>);
    }
}
//大部件
class Box extends Component{

    constructor(props){
        super(props);
        this.state ={
            list:this.props.sourceData
        }
    }
    checkSth(){
        var arr=[];
        //获取文本信息
        var inputValue = this.refs.myInput.value;
        //获取 props 信息
        var sourceData = this.props.sourceData;
        //选择数据 

        for(let i=0;i<sourceData.length;i++){
            if(sourceData[i].indexOf(inputValue)!= -1){
                arr.push(sourceData[i]);
            }
        }
        //更新状态机

        this.setState({list:arr});
    }

    render(){
        return(
        <div>
<input type="text" ref="myInput" onKeyUp={this.checkSth.bind(this)} />
<Items info={this.state.list} />
</div>
        );
    }
};
export default Box;

cat main.js

import React,{Component} from 'react';
import ReactDOM from 'react-dom';
import Box from './component/Box';
 var data = ['jackson','milly','john smith','make','denny','emili','jenny'];
 ReactDOM.render(
<Box sourceData={data}/>
    ,document.getElementById('index'));

这里写图片描述

React 框架的路线图可以分为几个阶段,从基础的前端技能开始,逐步深入到 React 核心概念、进阶功能、状态管理以及构建完整的应用。以下是详细的路线图及推荐资源: ### 1. 掌握基础的前端技能 在开始React 之前,必须具备扎实的 HTML、CSS 和 JavaScript 基础,特别是现代 JavaScript(ES6+)的语法和特性。 - **HTML/CSS**:了解基本的网页结构和样式设计。 - **JavaScript(ES6+)**:掌握变量、函数、对象、数组方法、解构、箭头函数、类、模块等语法。 - **DOM 操作**:理解如何使用 JavaScript 操作网页内容。 - **异步编程**:熟悉回调函数、Promise、async/await 等异步编程方式。 推荐资源: - [MDN Web Docs](https://developer.mozilla.org/):全面的前端开发文档资源。 - 《Eloquent JavaScript》:一本深入理解 JavaScript 的经典书籍[^1]。 - [FreeCodeCamp YouTube](https://www.youtube.com/@freecodecamp):提供基础 JavaScript 教程的视频资源。 ### 2. React 基础概念 一旦掌握了 JavaScript 基础,就可以开始React 的核心知识,包括组件化开发、JSX、props、state、生命周期方法等。 - **React 组件**:理解函数组件和类组件的区别。 - **JSX 语法**:习如何在 JavaScript 中编写类似 HTML 的结构。 - **组件间通信**:掌握父子组件之间的数据传递(props)。 - **状态管理**:了解组件内部状态(useState)和生命周期方法(如 componentDidMount)。 推荐资源: - [React 官方文档](https://react.dev/):最权威的 React 习资料。 - [The Road to React](https://www.robinwieruch.de/the-road-to-learn-react/):一本免费的 React 入门书籍。 - [Codecademy React 课程](https://www.codecademy.com/learn/react-101):交互式习平台,适合初者。 ### 3. 深入 React 进阶特性 在掌握基础后,可以进一步React 的进阶功能,例如 Hooks、Context API、高阶组件、自定义 Hook 等。 - **React Hooks**:如 `useState`、`useEffect`、`useContext` 等,用于替代类组件中的生命周期方法。 - **Context API**:用于跨层级组件共享状态,避免 props 逐层传递。 - **自定义 Hook**:封装可复用的状态逻辑。 - **React Portals**:用于渲染到 DOM 中的其他位置。 - **错误边界(Error Boundaries)**:用于捕获子组件树中的 JavaScript 错误。 推荐资源: - [Codevolution(Hooks/Redux)](https://www.youtube.com/c/Codevolution):提供详细的 React Hooks 和 Redux 教程。 - [React 官方文档 - Hooks](https://react.dev/reference/react):官方对 Hooks 的完整解释。 ### 4. React Router 和表单处理 构建单页应用(SPA)时,需要掌握路由管理,以及如何处理用户输入和表单验证。 - **React Router**:用于管理不同页面之间的导航。 - **表单处理**:习受控组件与非受控组件的区别,以及如何进行表单验证。 推荐资源: - [React Router 文档](https://reactrouter.com/) - [Traversy Media(React 入门)](https://www.youtube.com/c/TraversyMedia):提供关于 React 表单处理和路由的实用教程。 ### 5. 掌握状态管理工具(如 Redux) 当应用规模增大时,可以引入 Redux 或 Context API + useReducer 来管理全局状态。 - **Redux 基础**:理解 store、action、reducer 的概念。 - **Redux Toolkit**:官方推荐的简化 Redux 使用的工具包。 - **异步操作**:习如何使用 Redux Thunk 或 Redux Saga 处理异步请求。 推荐资源: - [Redux 官方文档](https://redux.js.org/) - [Codevolution(Redux)](https://www.youtube.com/c/Codevolution):系统讲解 Redux 及其在 React 中的应用。 ### 6. 习构建完整应用的技术栈 要开发完整的 React 应用,还需要掌握前后端交互、构建工具、部署流程等。 - **前后端交互**:使用 Axios 或 Fetch API 与后端 API 通信。 - **构建工具**:了解 Webpack、Babel、ESLint 等工具。 - **部署**:习如何将 React 应用部署到 Netlify、Vercel、GitHub Pages 等平台。 推荐资源: - [Next.js 文档](https://nextjs.org/):用于构建服务端渲染(SSR)和静态生成(SSG)应用。 - [Frontend Mentor](https://www.frontendmentor.io/):实战项目练习平台,提升设计稿转代码的能力。 ### 7. 实战项目与社区参与 通过实际项目练习,可以加深对 React 的理解,并参与社区交流,提升解决问题的能力。 - **实战项目**:尝试构建待办事项应用、博客系统、电商网站等。 - **社区参与**:加入 Stack Overflow、DEV Community、Reactiflux(Discord 群组)等社区[^1]。 --- ### 示例代码:React 组件基础结构 ```jsx import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return ( <div> <p>当前计数: {count}</p> <button onClick={() => setCount(count + 1)}>增加</button> </div> ); } export default Counter; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值