React 入门(一)

React

介绍

  • react就是一个框架 ,他相对于mvc来说只是其中的v 他适用于开发数据不断变化的大型应用程序
  • 在中大型项目中有百分之90的公司都用React框架;是因为React是由一个一个组件拼接而成的,它是一小部分一小部分拼接的,所以它在后期便于维护
  • 链接: 中文官网

基本使用

  1. 先创建以个html文件
  2. 引入react.js文件和dom文件(我在这里用的是网上的没有下载到本地)
    <!-- 提供 核心代码 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 提供与浏览器交互的DOM功能相当于DOM -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
  1. 在script标签中声明 ReactDom.render函数 它里面有对应的参数
  // ReactDOM.render(element, container , [callback])
  //  element:要渲染的内容
  //  container:要渲染的内容存放容器
  //  callback:渲染后的回调函数 

附完整代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Add React in One Minute</title>
  </head>
  <body>
    <!-- 提供 核心代码 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 提供与浏览器交互的DOM功能相当于DOM -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <div id="root"></div>
    <script>
        // ReactDOM.render(element, container , [callback])
        //  element:要渲染的内容
        //  container:要渲染的内容存放容器
        //  callback:渲染后的回调函数 
        //第一种写法
        // ReactDOM.render(
        //     // React.createElement(type,props,children)
        //     React.createElement('h1',null,'我是一个标题') ,   
        //     document.querySelector("#root"),
        //     ()=>{
        //         console.log('成功');  
        //     }
        // )
        let h1= React.createElement('h1',null,'我是一个标题')
        let p= React.createElement('p',null,'我是一个段落')
        let el= React.createElement('header',{id:"header"},h1,p)
        //第二种写法
        ReactDOM.render(
            el,
            document.querySelector("#root"),
            ()=>{
                console.log('成功');  
            }
        )
    </script>
  </body>
</html>

JSX语法(语法糖)

  • 注意事项:
  • 它是一个基于 JavaScript + XML 的一个扩展语法
  • 它可以作为值使用,并不是字符串,也不是HTML
  • 它可以配合JavaScript 表达式一起使用
  • 它不可以和js语句一起使用
  • 所有的标签必须是闭合,包括单标签
  • class要写成className
  • style接收的是一个对象,并不是字符串
  • 每次只能输出一个标签(或者说必须有一个容器)

JSX基本使用

  1. 使用时要规定babel类型,和引入babel文件
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <script type='text/babel'></script>
  1. 它使用是在ReactDOM.render()函数中直接定义标签就可以
         ReactDOM.render(
             <header>
                 <h1>{data.name}</h1>
                 <p>利用jsx渲染</p>
             </header>,
             document.querySelector("#root"),
             ()=>{
                 console.log('成功');  
             }
         )

附完整代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Add React in One Minute</title>
  </head>
  <body>
    <!-- 提供 核心代码 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 提供与浏览器交互的DOM功能相当于DOM -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="root"></div>
    <script type="text/babel">
         ReactDOM.render(
             <header>
                 <h1>我是标题</h1>
                 <p>我是段落</p>
             </header>,
             document.querySelector("#root"),
             ()=>{
                 console.log('成功');  
             }
         )
    </script>

  </body>
</html>

使用差值

  • 注意点:渲染时使用的是单括号{} 不是双括号{{}}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Add React in One Minute</title>
  </head>
  <body>
    <!-- 提供 核心代码 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 提供与浏览器交互的DOM功能相当于DOM -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="root"></div>
    <script type="text/babel">
        // 使用插值
        // let data='插值' //原样输出
        // let data=1 //原样输出
        // let data=false  //不输出
        // let data=null  //不输出
        // let data=undefined  //不输出
        // let data=['内容1','内容2']  // 去掉 ,  原样输出
         let data={
             name:'张',
             age:18
         } //对象要 .对象中的内容

        ReactDOM.render(
             <header>
                 <h1>{data.name}</h1>
                 <p>利用jsx渲染</p>
             </header>,
             document.querySelector("#root"),
             ()=>{
                 console.log('成功');  
             }
         )

    </script>

  </body>
</html>

条件渲染

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Add React in One Minute</title>
  </head>
  <body>
    <!-- 提供 核心代码 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 提供与浏览器交互的DOM功能相当于DOM -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="root"></div>
    <script type="text/babel">
        // 条件渲染
        ReactDOM.render(
            //会输出成立 如果写成false会输出不成立
            //基本使用
            // <header>
            //     <h1>{true?'成立':'不成立'}</h1> 
            //     <p>利用jsx渲染</p>
            // </header>,
            
            // 可以规定条件
                // ?类似 if..else()
                // || 类似if(!)取反
                // && 类似if()
            <header>
                <h1>{true?'成立':'不成立'}</h1> 
                <p>{false||'我是段落'}</p>
                <p>{false&&'正确'}</p>
            </header>,
            document.querySelector("#root"),
            ()=>{
                console.log('成功');  
            }
        )
    </script>

  </body>
</html>

解决每次只能输出一个标签使用Fragment

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Add React in One Minute</title>
  </head>
  <body>
    <!-- 提供 核心代码 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 提供与浏览器交互的DOM功能相当于DOM -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="main">
        <div id='header'></div>
        <div id='container'></div>
        <div id='root'></div>
    </div>
    <script type="text/babel">
    let style={
        width:'100px',
        height:'200px',
        backgroundColor:'green'
    }
    let {Fragment}=React
        ReactDOM.render(
            // <div>
            //     <div className='box' style={ {width:'300px',height:'400px'} }></div>
            // </div>,
            // 还可以用这种方法  style在上面定义
            <div className='box' style={style}>11</div>,

            // 用Fragment包裹可以写多个标签
            // <Fragment>
            //     <div className='box' style={style}></div>
            //     <p>我是段落</p>
            // </Fragment>,
            document.querySelector("#root"),
        )
    </script>
    <style>
        .box{
            width: 100px;
            height: 100px;
            background-color: red;
        }
    </style>
  </body>
</html>

列表循环

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
    <!-- 提供 核心代码 -->
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <!-- 提供与浏览器交互的DOM功能相当于DOM -->
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="root"></div>
    <script type="text/babel">
    // 列表循环
    // 第一种写法
        let data=['内容1','内容2','内容3','4']
        // function toData(){
        //    let arr=[];
        //    data.forEach((item)=>{
        //        //注意使用单括号不是双括号
        //        arr.push(<li>{item}</li>)
        //    })
        //    return arr
        // }
        // ReactDOM.render(
        //     <header>
        //         {toData()}
        //     </header>,
        //     document.querySelector("#root"),
        //     ()=>{
        //         console.log('成功');  
        //     }
        // )
        // 第二种写法
        ReactDOM.render(
            <ul>
                {
                    data.map((item)=>{
                        return <li>{item}</li>
                    })
                }
            </ul>,
            document.querySelector("#root"),
            ()=>{
                console.log('成功');  
            }
        )
    </script>
  </body>
</html>

以上就是单文件使用React,下面我们来看一下自动化构建的React怎么使用

搭建React框架

搭建框架步骤

  1. 创建一个文件夹来存放React框架
  2. cmd进入这个文件
  3. 安装create-react-app
命令:npm i -g create-react-app
  1. 安装完之后使用 create-react-app 命令搭建框架
//注意不要用驼峰命名法 推荐全小写
create-react-app 项目名称
  1. 完成之后使用 即按照提示cd xxx 和npm start 即可

框架的基本使用(写了一个案例做理解参考)

  • 你可把src中的文件全部删除只剩下index.js文件
  • 然后创建一个入口文件app.js(这是个空文件)
    index.js文件中的内容即下
import ReactDOM from 'react-dom';
//引入文件
import App from './app'

ReactDOM.render(
	//页面输出Hellow后就可吧这个Hellow删除
	//'Hellow',
	//这里相当于注册组件
  <App/>,
  document.getElementById('root')
);

app.js这里声明的是一个类式组件

import React,{Component} from 'react'
//引入friend组件
import Friend from './friend'
//  类式组件
//  组件类必须继承 **React.Component**
//  组件类必须有 **render** 方法
//  render的return后定义组件的内容
// 注意:记得导出
class App extends Component{
    render(){
    //先随意写一个内容做测试 , 在页面上显示之后就可删除
    //return (<div>哈喽</div>)
        return (<div><Friend/></div>)
    }
}
//导出APP类
export default App

定义一个friend.js文件

import {Component} from 'react'
//引入样式
import  './friend.css'
//引入数据
import data from './data'
//吧要显示在页面的数据封装到一个文件中
import DataList from './dataList'
//firend是你这个文件的名字
export default  class friend extends Component{
    render(){
        return (
        <div className="friend-list">

            {/* Object.keys  这个方法会吧给定对象自身的内容返回一个数组*/ }
            {
                Object.keys(data).map((item,index)=>{
                    return (
                        <DataList
                            key={index}
                            name={item}
                            value={data[item]}
                        />
                    )
                })
            }
        </div>
        )
    }
}

friend.css文件

.friend-list {
    border: 1px solid #000000;
    width: 200px;
}
.friend-group dt {
    padding: 10px;
    background-color: rgb(64, 158, 255);
    font-weight: bold;
}
.friend-group dd {
    padding: 10px;
    display: none;
}
.friend-group.expanded dd {
    display: block;
}
.friend-group dd.checked {
    background: green;
}

data.js文件

  • 为了提高组件的复用性,通常会把组件中的一些可变数据提取出来
let datas = {
    family: {
        title: '家人',
        list: [
            {name: '爸爸'},
            {name: '妈妈'}
        ]
    },
    friend: {
        title: '朋友',
        list: [
            {name: '张三'},
            {name: '李四'},
            {name: '王五'}
        ]
    },
    customer: {
        title: '客户',
        list: [
            {name: '阿里'},
            {name: '腾讯'},
            {name: '头条'}
        ]
    }
}
//吧datas暴露出去
export default datas

dataList.js文件

import React,{Component} from 'react'
export default class dataList extends Component{
    // state 组件自身状态
    // 它的主要作用是用于组件保存、控制、修改 *自己* 的可变状态,在组件内部进行初始化,也可以在组件内部进行修改,但是组件外部不能修改组件的 state
    //setState()修改state中的数据
    state={
        isOpen:false
    }
    render (){
    	//props 父组件传递过来的参数
        // console.log(this.props);
        let {title,list}=this.props.value
        let {isOpen} = this.state
        //下面的onClick是一个点击事件 注意他的大小写
       //在onClick中使用()=> (箭头函数是因为他的this指向问题)
        return(
            <div className={"friend-group "+(isOpen?"expanded":"")}>
                    <dt onClick={
                        ()=>this.setState({
                            isOpen:!isOpen
                        })   
                    }>{title}</dt>
                    {
                        list.map((item,index)=>{
                        return <dd key={index}>{item.name}</dd>
                        })
                    }
            </div>
        )
    }
}

最后的文件格式是这样的
在这里插入图片描述
最后的效果图
点击就会显对应的内容
在这里插入图片描述
总结:

  • react最显著的优势就是组件
  • 组件是react的核心,一个完整的react应用是由若干个组件搭建起来的,每个组件有自己的数据和方法,组件具体如何划分,需要根据不同的项目来确定
  • 简单说就是组件可复用,可维护性高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值