React详解

介绍:

React是一个用于构建用户界面的javaScript库,起源于facebook的内部项目,在13年f进行开源

17版本官网:React -- A JavaScript library for building user interfaces

18版本官网:React 官方中文文档

特点:

  1. 声明式编码
  2. 组件化编码
  3. React Native 编写原生应用
  4. 高效(优秀的Diffing算法)

一、基础

主要核心,依赖下面四个文件

html 复制代码
    <!-- 引入核心库。全局出现React对象-->
    <script type="text/javascript" src="./React-js/16.8/react.development.js"></script>
    <!-- 用于支持react操作DOM。全局出现ReactDOM对象-->
    <script text="text/javascript" src="./React-js/16.8/react-dom.development.js"></script>
    <!-- 用于将jsx转换为js -->
    <script text="text/javascript" src="./React-js/16.8/babel.min.js"></script>
    <!-- 用于对组件标签属性进行限制。全局出现PropTypes对象 -->
    <script src="./React-js/16.8/prop-types.js"></script>

1、基本使用

1.1、虚拟dom

关于虚拟DOM:

  • 本质是object类型的对象(一般对象)
  • 虚拟DOM比较"轻",真实DOM比较"重",因为虚拟DOM是React内部在用,无需真实DOM 上:那么多的属性。
  • 虚拟DOM最终会被React转化为真实DOM。呈现在页面上
html 复制代码
<body>
    <div id="test"></div>

    <!-- 引入核心库 -->
    <script type="text/javascript" src="./React-js/16.8/react.development.js"></script>
    <!-- 用于支持react操作DOM -->
    <script text="text/javascript" src="./React-js/16.8/react-dom.development.js"></script>
    <!-- 用于将jsx转换为js -->
    <script text="text/javascript" src="./React-js/16.8/babel.min.js"></script>

    <!-- 一定是babel -->
    <script type="text/babel">
        // 创建虚拟dom
        const VDOM = <h1>Hello.React</h1>
        const VDOM2 = <h1>----------------</h1>
        // 渲染虚拟DOM到页面(后面的会替换之前)
        ReactDOM.render(VDOM,document.getElementById('test'))
        ReactDOM.render(VDOM2,document.getElementById('test'))
    </script>
</body>

2.2、JSX写法

1、全称: JavaScript XML。

2、react定义的一种类似于XML的JS扩展语法: JS + XML本质是React.createElement(component, props, ...children)方法的语法糖

3、作用: 用来简化创建虚拟DOM

写法:var ele = <h1> Hello JSX! </h1>

注意1:它不是字符串, 也不是HTML/XML标签

注意2:它最终产生的就是一个JS对象

4、jsx语法规则:

  1. 定义虚拟DOM时,不要写引号。
  2. 标签中混入JS表达式时要用{}-
  3. 样式的类名指定不要用class,要用className.
  4. 内联样式,要用style={{key : value}}的形式去写。
  5. 只有一个根标签
  6. 标签必须闭合
  7. 标签首字母

(1).若小写字母开头,则将改标签转为htm1中同名元素,若htm1中无该标签对应的同名元素,则报错。

(2).若大写字母开头,react就去渲染对应的组件,若组件没有定义,则报错。

html 复制代码
<body>
    <div id="test"></div>

    <!-- 引入核心库 -->
    <script type="text/javascript" src="./React-js/16.8/react.development.js"></script>
    <!-- 用于支持react操作DOM -->
    <script text="text/javascript" src="./React-js/16.8/react-dom.development.js"></script>
    <!-- 用于将jsx转换为js -->
    <script text="text/javascript" src="./React-js/16.8/babel.min.js"></script>

    <!-- js写法 -->
    <script type="text/javascript">
        // 创建虚拟dom
        const VDOM = React.createElement('h1',{id:'title'},React.createElement('span',{},'js写法'))
        // 渲染虚拟DOM到页面(后面的会替换之前)
        ReactDOM.render(VDOM, document.getElementById('test'))
    </script>

    <!-- jsx写法 -->
    <script type="text/babel">
        const data = ['抽烟','喝酒','烫头']
        const obj = {name1:'抽烟',name2:'喝酒',name3:'烫头'}
        const myId = 'song'
        const myData = 'HELLO'
        const VDOM = (
            <div>
                <h1 className="box" id={myId}>
                    <span style={{ color: 'red', fontSize: '40px' }}>{myData.toLocaleLowerCase()}</span>
                </h1>
                <input type="text" />
                <ul>
                   {
                    // data   // 直接使用数组,会自动遍历
                    // obj     // 对象,会报错
                    data.map((item,i)=><li key={i}>{item}</li>)
                   }
                </ul>
            </div>

        )
        // 渲染虚拟DOM到页面(后面的会替换之前)
        ReactDOM.render(VDOM, document.getElementById('test'))
    </script>
</body>

2、函数式组件

html 复制代码
 <script type="text/babel">
        // 定义函数组件
        function Demo() {
            console.log(this);  // 经过babel转化开启严格模式,this没有明确的调用,所以为undefined
            return <h2>函数定义的组件</h2>
        }
        // 渲染组件到页面
        ReactDOM.render(<Demo />, document.getElementById('test'))


        /*
        执行了ReactDOM.render( <MyComponent/>.......之后,发生了什么?
        1.React解析组件标签,找到了MyComponent组件。
        2.发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOW转为真实DOM,随后呈现在页面中。

        */
    </script>

3、类组件

html 复制代码
<script type="text/babel">
        // 定义类组件
        class Demo extends React.Component{
            render(){
                // render:类的原型对象上(可在浏览器控制台输入Demo回车测试),供实例使用
                // this指向Demo的实例对象。俗称:组件对象或组件实例对象
                console.log('render中this',this);
                return (
                    <h2>类定义的组件</h2>
                )
            }
        }
        // 渲染组件到页面
        ReactDOM.render(<Demo />, document.getElementById('test'))


         /*
        执行了ReactDOM.render( <MyComponent/>.......之后,发生了什么?
        1.React解析组件标签,找到了MyComponent组件。
        2.发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用原型上的render方法
        3.将返回的虚拟DOW转为真实DOM,随后呈现在页面中。
        */
    </script>

4、组件的三大核心

4.1、state:存放状态

html 复制代码
 <script type="text/babel">
        // 定义类组件
        class Weather extends React.Component {
            constructor(props) {    // 构造器只调用一次 
                super(props)
                // 初始化状态
                this.state = {
                    isHot: false,
                    wind: '大风'
                }
                // 改变原型上的demo的this指向,并把原型上的demo赋值到实例上的demo上。处理下面this为undefind
                this.demo = this.demo.bind(this)
            }
            render() {     // 调用1+n次。1:初始化   n:状态更新的次数
                return (
                    <h2 onClick={this.demo}>今天天气{this.state.isHot ? '炎热' : '很冷'}</h2>
                )
            }
            demo() {
                // demo放在哪里? Weather的原型对象上,供实例使用
                //由于demo是作为onclick的回调,所以不是通过实例调用的,是直接调用
                //类中的方法默认开启了局部的严格模式,所以demo中的this为undefined
                console.log('this', this); // undefind

                // 不能直接修改值。数据虽然变化,但页面不刷新
                // this.state.isHot = !this.state.isHot
                // 注意:需要通过setState方法来修改状态
                this.setState({ isHot: !this.state.isHot })
            }
        }
        // 渲染组件到页面
        ReactDOM.render(<Weather />, document.getElementById('test'))

        function demo() {
            // console.log('被点击');
            alert('被点击')
        }
    </script>
(1)、state简写
html 复制代码
<script type="text/babel">
        // 定义类组件
        class Weather extends React.Component {
            // 初始化状态
            state = { isHot: false, wind: '大风' }

            render() {    
                return (
                    <h2 onClick={this.demo}>今天天气{this.state.isHot ? '炎热' : '很冷'}</h2>
                )
            }
            // 自定义方法---需要赋值语句的形式+箭头函数
            demo = ()=> {
                console.log('this', this); // undefind

                this.setState({ isHot: !this.state.isHot })
            }
        }
        // 渲染组件到页面
        ReactDOM.render(<Weather />, document.getElementById('test'))

    </script>
    <!-- 
        1、组件中 render方法中的this 为组件实例对象-
        2、组件自定义的方法中this为 undefined,如何解决?
                 a.强制绑定this:通过函数对象bind
                 b.箭头函数
        3、状态数据,不能直接修改或更新
     -->

4.2、props:接收参数

html 复制代码
 <script type="text/babel">
        // 定义类组件
        class Weather extends React.Component {

            render() {
                console.log(this);
                return (
                    <ul>
                        <li>姓名:{this.props.name}</li>
                        <li>性别:{this.props.sex}</li>
                        <li>年龄:{this.props.age}---{this.props.flag}</li>
                    </ul>
                )
            }
        }

        const p = { name: 'tom', age: 18, sex: '女' }

        // 渲染组件到页面
        ReactDOM.render(<Weather {...p} flag={666}/>, document.getElementById('test'))

    </script>
相关推荐
EricWang13581 分钟前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
September_ning1 分钟前
React.lazy() 懒加载
前端·react.js·前端框架
晴天飛 雪11 分钟前
React 守卫路由
前端框架·reactjs
web行路人11 分钟前
React中类组件和函数组件的理解和区别
前端·javascript·react.js·前端框架
番茄小酱00113 分钟前
Expo|ReactNative 中实现扫描二维码功能
javascript·react native·react.js
超雄代码狂33 分钟前
ajax关于axios库的运用小案例
前端·javascript·ajax
长弓三石42 分钟前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
小马哥编程43 分钟前
【前端基础】CSS基础
前端·css
嚣张农民1 小时前
推荐3个实用的760°全景框架
前端·vue.js·程序员
周亚鑫1 小时前
vue3 pdf base64转成文件流打开
前端·javascript·pdf