bunny笔记|React基础篇(Demo:实现学生信息录入系统

2022-04-02  本文已影响0人  一只小小小bunny

第一章 基础篇-快速入门

React.png
  1. 使用组件化开发方式,符合现代Web开发的趋势,企业前后端项目分离,react是首选
  2. 技术成熟,社区完善,配件齐全,适用于大型web项目(生态系统健全)
  3. 由Facebook专门的团队维护,技术可靠
  4. ReactNative -Leam once,write anywhere:Build mobile apps with React
  5. 使用方式简单,性能非常高,支持服务端渲染
  6. React使用前端技术非常全面,有利于整体提高技术水平,此外,有利于求职和晋升,有利于参与潜力大的项目
  1. 2013年5月开源,是前端的三大主流框架
  2. React是用于构建用户界面的JavaScript库,围绕Rect的技术栈主要包括:React redux,react-redux,react-router,...
  3. 官方官网 中文官网
  1. react具备的特点:
    1)使用JSX语法创建的组件,实现组件化开发,为函数的UI编程方式打开了大门;
    2)性能高:通过diff算法 和 虚拟DOM实现函数视图的高效渲染和更新;
    3)JSX-->HTML ,JSX-->native ios 或 android中的组件(XML) ,JSX-->VR/AR ,JSX--TO-->EveryThing, 声明式、组件化、一次学习,随处编写(无论你现在使用什么技术栈,在无需重写现有代码的前提下,通过引入 React 来开发新功能。React 还可以使用 Node 进行服务器渲染,或使用 React Native 开发原生移动应用。)
  1. React核心:
    1)虚拟DOM(1.==概念==:react将DOM抽象为DOM,虚拟DOM其实就是用一个对象来描述DOM,通过对比前后两个对象的差异,最终只把变化的部分重新渲染,提高渲染的效率;
    2.==为什么要用虚拟DOM==:当DOM发生更改时需要遍历DOM对象的属性,而原生DOM可便利多达200多个,而且大部分属性与渲染无关,导致更新页面代价太大。
    3.==虚拟DOM的处理方式==:
  • 用JS对象结构表示DOM树的结构,然后用这个树构建一个真正的DOM树,插到文档当中(一次性)。
  • 当状态变更的时候,重新构造一棵新的对象树,然后用新的树和旧的树进行比较,记录两棵树的差异。
  • 把记录的差异应用到步骤1 所构建的真正的DOM树上,视图就更新了。);
    2)Diff算法(1.==概念==:最小化页面重绘。(当我们使用react在render()函数创建了一棵react元素树,在下一个state或者props更新的时候,render()函数会创建一棵树的react的元素树。react将对比这两棵树的不同之处,计算出如何高效的更新UI(只更新变化的地方),此处所采纳的算法就是diff算法。)(2.==其它==:项目中具体了解)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <div id="app"></div>

<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/html">
    // 1.获取页面真实的容器元素
    const containerDiv = document.getElementById('app');
    // 2. jsx语法创建虚拟DOM对象
    const vDom = <div>你好!</div>;
    // 3. 将虚拟DOM渲染到页面元素上去
    ReactDOM.render(vDom, containerDiv);
</script>  
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div id="app1"></div>
<div id="app2"></div>

<!--
  往容器中插入一个span标签, class为: "it-like", 内容为: "学习React"。
  两种实现方式: a) 通过典型js方式;  b) JSX方式?
-->
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script>
    // a) 通过典型js方式

    // 1. 创建变量
    let myClass = 'it-like';
    let myContent = '学习React';

    // 2. 创建DOM
    const vDOM = React.createElement('span', {className: myClass}, myContent);

    // 3. 将虚拟DOM渲染到页面元素上去
    ReactDOM.render(vDOM, document.getElementById('app1'));
</script>

<script type="text/babel">
    // b) JSX方式
    const vDom1 = <span className={myClass.toUpperCase()}>{myContent}</span>;
    ReactDOM.render(vDom1, document.getElementById('app2'));
</script>
</body>
</html>

html中实现React的应用:方式1-传统引入js的方式; 方式2-JSX方式。

总结:1.JSX只是高级语法糖,最终执行时还是会被转成原生js,通过babel等方式;
2.更加语义化,更加直观,代码可读性更高;
3,性能相对原生方式更好一些。

JSX常见的页面操作方式:
主体:1).多重标签嵌套,2).js中的变量表达式要写在{}里,3).内联样式通过对象方式引入,4).数组遍历

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>React 练习</title>
</head>
<body>
    <div id="app">
    </div>
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/html">
    // a. 多重标签嵌套
    ReactDOM.render(
        <div>
            <h2>多层标签嵌套</h2>
            <img src="img/logo.jpg" alt="学习React"  width="300" />
            <p>测试!</p>
        </div>
    , document.getElementById('app'));
</script>
<script type="text/html">
    // b. js中的变量, 表达式要写在{}内
    const str = '学习React';
    ReactDOM.render(
        <div>
           <span>{str}</span>
           <p>100 + 20 * 2 /5 *3 = {100 + 20 * 2 /5 *3}</p>
        </div>
        , document.getElementById('app'));
</script>
<script type="text/babel">
    // c. 内联样式通过对象方式引入

    const myStyle = {
      backgroundColor: 'purple',
      color: 'yellow',
      fontSize: 30
    };

    ReactDOM.render(
        <div>
            // 注释
            /*注释*/
            {/*真正的JSX注释*/}
            <h2>来点颜色</h2>
            <div style={myStyle}>客官,颜色来了!</div>
        </div>
        , document.getElementById('app'));
</script>
<script type="text/html">
    // 1. 数据
    /**/
    const dataArr = [
        {name: '张三', age: 38},
        {name: '谢锋', age: 40},
        {name: '刘华', age: 48},
        {name: '学习React学员', age: 2}
    ];

    // 2. 创建虚拟DOM
    const vDOM = (
        <ul>
            {
                dataArr.map((data, index) =>
                    <li key={index}>{index + 1} --- 姓名: {data.name} --- 年龄:{data.age}岁</li>
                )
            }
        </ul>
    );

    ReactDOM.render(
        vDOM
        , document.getElementById('app'));
</script>
</body>
</html>

总结:
1.JSX中添加属性时,使用className代替class,像label中的 for属性,使用htmlFor代替;
2.JSX创建DOM的时候,所有的节点,必须有唯一的根元素进行包惠:
3.JSX语法中,标签必须成对出现,如果是单标签,则必须自闭合
4.在JSX中可以直接使用JS代码,直接在JSX中通过)中间写JS代码即可,
5在JSX中只能使用表达式,不能出现语句:
6.在JSX中注释语法:1/中间是注释的内容/

React中的组件/模块,组件化/模块化
一个应用/版块/页面中用于实现某个局部的功能(包括html,js,css等)
1)组件 把这些局部功能组装到一起就形成了完整的一个大的功能
主要目的在于:复用代码,提高项目运行效率。
2)组件化 如果一个应用是用多组件的方式进行综合开发的,那么这个应用就是一个组件化应用。
多个组件形成模块,或者是一个提供特定功能的js文件,主要特点在
3)模块 于耦合性低,可移植性高,执行效率好。
如果一个应用都是用模块的形式来构建的,那么这个应用就是模块

4)模块化 化应用。

React中组件的创建方式:1)构造函数创建组件; 2)class关键字创建组件 ;
3)区别:
使用构造函数来创建组件时,如果要接收外界传递的数据,需要在构造函数的参数列表中使用props来接收;
必须要向外return一个合法的JSX创建的虚拟DOM;
Demo:简单组件/带参数组件/复合组件。

class关键字创建组件
<script>
    class Liao extends React.Component{
        render(){
            return ()
            
        }
        
     ReactDOM.render();
</script>

例:

<script type="text/babel">
    class Liao extends React.Component{
        render(){
            return (
                <div>
                    <h2>我叫:{this.props.name}, 性别:{this.props.gender}, 我有3个学科:{this.props.colleges}</h2>
                </div>
            )
        }
    }

    ReactDOM.render(
        <Liao name="学习React学员" gender="女" colleges={["h5 ", "Java ", "Python"]}/>,
        document.getElementById('app')
    );
</script>

区别:1)构造函数创建的组件叫:无状态组件;2)class关键字创建的组件叫:有状态组件;3)有状态组件与无状态组件的本质区别在于是否有state(状态)属性。

什么是state?
React把组件看成是一个状态机(State Machines),通过状态(State)去操作状态机。
在开发中,通过与用户的交互,实现不同的状态,然后渲染UI,让用户界面和数据保持一致。
在React中只需要更新组件的state,然后根据新的state重新渲染用户界面(不需要操作DOM)

state的使用方式?

 class Liao extends React.Component{
     constructor(props){}
     
     render(){}
     
     dealClick(){}
     
 }
 
 ReactDOM.render();
 

例:

<script>
    // 1. 创建组件类
    class Liao extends React.Component{
        
        constructor(props){
            super(props);

            // 2. 初始化状态
            this.state = {
                name: '周杰伦',
                gender: '男',
                intro: '七里香'
            };

            // this.dealClick = this.dealClick.bind(this);
        }
        
        render(){
            const {name, gender, intro} = this.state;
            return (
                <div>
                    <h3>我叫:{name}, 性别:{gender}, 代表作:{intro}</h3>
                    <button onClick={()=>this.dealClick()}>换一个</button>
                </div>
            )
        }

        dealClick(){
           //  alert('点了'+ this);
            this.setState({
                name: '王菲',
                gender: '女',
                intro: '因为爱情'
            });
        }
    
    }

    // 2. 渲染到DOM容器
    ReactDOM.render(
        <Liao/>,
        document.getElementById('app')
    );
</script>

props和state总结:
1)在单组件中props一般用于接收外部传入的数据;而state则用于记录组件内部数据,而且是需要经常改变的数据
2)state是组件内部的状态(数据),不能够直接修改,必须要通过setState来改变值的状态,从而达到更新组件内部数据的作用
3)props更多是组件间传递数据的一种方式,props同样也可以传递state。由于React的数据流是自上而下的,所以是从父组件向子组件进行传递;另外组件内部的thisprops属性是只读的不可修改。

例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>React 练习</title>
</head>
<body>
    <div id="app"></div>
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/prop-types.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/babel">
    // 1. 组件类
    class Dog extends React.Component{
        constructor(props){
            super(props);

            // 狗: 姓名, 性别, 年龄, 狗友
            // 2. 初始化state
            this.state = {
                 age: 1, //年龄
                 dogFriends: [] // 狗友
            }
        }

        // 3. 设置props属性的默认值
        static defaultProps = {
            name: '旺财',
            gender: '公'
        };

        // 4. 设置props属性的类型
        static propTypes = {
            name: PropTypes.string.isRequired,
            gender: PropTypes.string.isRequired
        };

        render(){
            const {name, gender} = this.props;
            const {age, dogFriends} = this.state;
            return (
                <div>
                    <p>狗名:{name}, 性别:{gender}</p>
                    <p>我今年{age}岁了</p>
                    <p>我有很多狗友:</p>
                    <ul>
                        {dogFriends.map((friend, index)=>(
                            <li key={index}>{friend}</li>
                        ))}
                    </ul>
                    <button onClick={()=>this.addYear()}>增一岁</button>
                </div>
            )
        }
        addYear(){
           // 1. 增加狗友
           let tempArr = this.state.dogFriends;
           tempArr.push('狗友'+Math.floor(Math.random()*100));

           // this.props.name = '哈哈哈';
          /* this.setProps({
               name: '哈哈哈哈'
           });*/

           // 2. 更新状态
            this.setState({
                age: this.state.age + 1,
                dogFriends: tempArr
            })
        }
    }

    ReactDOM.render(
        <Dog/>,
        document.getElementById('app')
    );
</script>
</body>
</html>

ref的使用:
1)定义:Refs提供了一种方式,用于访问在render方法中创建的DOM节点或 React元素。
2)使用场景:a)处理焦点、文本选择或媒体控制。 b)触发强制动画。
c)集成第三方DOM库。
3)注意:官方提示,如果可以通过声明式实现,则尽量避免使用refs。话外音:React无法控制局面的时候,就需要直接操作Refs了。
让输入框获得焦点?
4)案例使用 :核心代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>React 练习</title>
</head>
<body>
    <div id="app"></div>
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/babel">
    class CustomTextInput extends React.Component {
        constructor(props){
            super(props);

            // 绑定ref
            this.myInput = React.createRef();
            this.myBtn = React.createRef();
        }

        render(){
            return (
                <div>
                    <input ref={this.myInput} type="text" placeholder="请输入内容"/>
                    <input ref={this.myBtn} type="button" value="获取焦点" onClick={()=>this.focusTextInput()}/>
                </div>
            )
        }

        focusTextInput(){
            // console.log(this.myInput);
            this.myInput.current.focus(); // 获取焦点
            console.log(this.myBtn);
        }
    }

    ReactDOM.render(
        <CustomTextInput/>,
        document.getElementById("app")
    );
</script>
</body>
</html>

基础篇-案例

案例1:

需求:用react实现一个学生信息录入系统用户页面,并用组件化思维实现添加和删除功能

(1)页面展示

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Admin</title>
    <style>
        #app {
            margin: 50px auto;
            width: 600px;
        }

        fieldset {
            border: 1px solid rgb(233, 156, 41);
            margin-bottom: 20px;
        }

        fieldset input {
            width: 200px;
            height: 30px;
            margin: 10px 0;
        }

        table {
            width: 600px;
            border: 2px solid rgb(233, 156, 41);
            text-align: center;
        }

        thead {
            background-color: rgb(233, 192, 130);
            color: #fff;
        }
    </style>
</head>

<body>
    <div id="admin"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/prop-types.js"></script>
    <script src="../js/babel.min.js"></script>

    <script type="text/babel">
        //1.父类
    class Admin extends React.Component {
                    //渲染
        render() {
            return (
                <div>
                    <Add />,
                    <List />
                </div>

            );
        }
    }
        
    //2.子类-添加板块
    class Add extends React.Component {

        //渲染html元素
        render() {
            return (
                <div>
                    <fieldset>
                        <legend>信息录入系统(React版)</legend>
                        <div>
                            <span>姓名: </span>
                            <input type="text" placeholder="请输入姓名" />
                        </div>
                        <div>
                            <span>年龄: </span>
                            <input type="text" placeholder="请输入年龄" />
                        </div>
                        <div>
                            <span>性别: </span>
                            <select>
                                <option value="男">男</option>
                                <option value="女">女</option>
                            </select>
                        </div>
                        <div>
                            <span>手机: </span>
                            <input type="text" placeholder="请输入手机号码" />
                        </div>
                        <button>新增学员</button>
                    </fieldset>
                </div>
            )
        }
    }
    
        //3.子类-展示板块
        class List extends React.Component {
            //渲染html元素
            render() {
                return (
                    <div>
                        <table>
                            <thead>
                                <tr>
                                    <td>姓名</td>
                                    <td>性别</td>
                                    <td>年龄</td>
                                    <td>手机</td>
                                    <td>删除</td>
                                </tr>
                            </thead>
                        <tbody>
                        <tr>
                            <td>周杰伦</td>
                            <td>男</td>
                            <td>38</td>
                            <td>18888888888</td>
                            <td>
                                <button>删除</button>
                            </td>
                        </tr>
                        </tbody>
                        </table>
                    </div>
                )
            }
        }
        
    //4.渲染到浏览器页面显示
    ReactDOM.render(
        <Admin />,
        document.getElementById('admin')
    )

(2)数据动态展示

    constructor(props) {
        super(props);
        //初始化
        this.state = {
            studentArr: [
                { name: '小华', age: 30, gender: '男', phone: '18888889999' },
                { name: '小明', age: 30, gender: '男', phone: '18888889994' },
                { name: '小米', age: 20, gender: '女', phone: '18888889992' }
            ]
        }
    }

(数据在父类构造初始化状态,要传给子类展示,要在子类约束类型)

//设置props中属性的类型
//.isRequired表示必传值
static propTypes = {
    studentArr: PropTypes.array.isRequired
}
//获取传过来的参数
const { studentArr} = this.props
//处理传入的参数,注意要绑定key值
<tbody>
    {
        studentArr.map((stu, index) => (
            <tr key={index}>
                <td>{stu.name}</td>
                <td>{stu.gender}</td>
                <td>{stu.age}</td>
                <td>{stu.phone}</td>
                <td>
                    <button>删除</button>
                </td>
            </tr>
        ))
    }
</tbody>

(3)实现删除

    //删除功能
    delFormData(index) {
        //1.删除
        const { studentArr } = this.state;
        studentArr.splice(index, 1);
        //2.删除后更新页面状态
        this.setState({
            studentArr
        })
    }
    //设置props中属性的类型
    //.isRequired必传值
    static propTypes = {
        studentArr: PropTypes.array.isRequired,
        delFormArr:PropTypes.func.isRequired
    }
    <List studentArr={this.state.studentArr } delFormArr={this.delFormData}/>
    const { studentArr,delFormArr} = this.props
    <td>
        <button onClick={()=>delFormArr(index)}>删除</button>
    </td>

    //绑定删除的this
    this.delFormData = this.delFormData.bind(this);

(4) 添加

    //新增学员
    addStudent(student){
        //1.插入
        const {studentArr} =this.state;
        studentArr.unshift(student);
        //2.更新数据
        this.setState({
            studentArr
        })
    }

    //绑定this
    this.addStudent = this.addStudent.bind(this);
    //设置props中属性的类型
    //.isRequired必传值
    static propTypes = {
        studentArr: PropTypes.array.isRequired,
        delFormArr:PropTypes.func.isRequired
    }
    
    constructor(props){
        super(props);
        //绑定ref
        this.stuName = React.createRef();
        this.stuAge = React.createRef();
        this.stuGender = React.createRef();
        this.stuPhone = React.createRef();
    }
            
    <fieldset>
        <legend>信息录入系统(React版)</legend>
        <div>
            <span>姓名: </span>
            <input ref={this.stuName} type="text" placeholder="请输入姓名" />
        </div>
        <div>
            <span>年龄: </span>
            <input ref={this.stuAge} type="text" placeholder="请输入年龄" />
        </div>
        <div>
            <span>性别: </span>
            <select ref={this.stuGender}>
                <option value="男">男</option>
                <option value="女">女</option>
            </select>
        </div>
        <div>
            <span>手机: </span>
            <input ref={this.stuPhone} type="text" placeholder="请输入手机号码" />
        </div>
        <button  onClick={() => this.dealWithClick()}>新增学员</button>
    </fieldset>
<Add addStudentArr={this.addStudent} />

完整源码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Admin</title>
    <style>
        #app {
            margin: 50px auto;
            width: 600px;
        }

        fieldset {
            border: 1px solid rgb(233, 156, 41);
            margin-bottom: 20px;
        }

        fieldset input {
            width: 200px;
            height: 30px;
            margin: 10px 0;
        }

        table {
            width: 600px;
            border: 2px solid rgb(233, 156, 41);
            text-align: center;
        }

        thead {
            background-color: rgb(233, 192, 130);
            color: #fff;
        }
    </style>
</head>

<body>
    <div id="admin"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/prop-types.js"></script>
    <script src="../js/babel.min.js"></script>

    <script type="text/babel">
        //1.父类
        class Admin extends React.Component {
            constructor(props) {
                super(props);
                //初始化
                this.state = {
                    studentArr: [
                        { name: '小华', age: 30, gender: '男', phone: '18888889999' },
                        { name: '小明', age: 30, gender: '男', phone: '18888889994' },
                        { name: '小米', age: 20, gender: '女', phone: '18888889992' }
                    ]
                }

                //绑定this
            this.delFormData = this.delFormData.bind(this);
            this.addStudent = this.addStudent.bind(this);
            }

            //删除功能
            delFormData(index) {
                //1.删除
                const { studentArr } = this.state;
                studentArr.splice(index, 1);
                //2.删除后更新页面状态
                this.setState({
                    studentArr
                })
            }

            //新增学员
            addStudent(student){
                //1.插入
                const {studentArr} =this.state;
                studentArr.unshift(student);
                //2.更新数据
                this.setState({
                    studentArr
                })
            }
            //渲染
            render() {
                return (
                    <div>
                        <Add addStudentArr={this.addStudent} />,
                        <List studentArr={this.state.studentArr } delFormArr={this.delFormData}/>
                    </div>
                );
            }
        }

        //2.子类-添加板块
        class Add extends React.Component {
            constructor(props){
                super(props);
                //绑定ref
                this.stuName = React.createRef();
                this.stuAge = React.createRef();
                this.stuGender = React.createRef();
                this.stuPhone = React.createRef();
            }

            //  设置props中属性的类型
            static propTypes = {
                addStudentArr: PropTypes.func.isRequired
            };
            //渲染html元素
            render() {
                return (
                    <div>
                        <fieldset>
                            <legend>信息录入系统(React版)</legend>
                            <div>
                                <span>姓名: </span>
                                <input ref={this.stuName} type="text" placeholder="请输入姓名" />
                            </div>
                            <div>
                                <span>年龄: </span>
                                <input ref={this.stuAge} type="text" placeholder="请输入年龄" />
                            </div>
                            <div>
                                <span>性别: </span>
                                <select ref={this.stuGender}>
                                    <option value="男">男</option>
                                    <option value="女">女</option>
                                </select>
                            </div>
                            <div>
                                <span>手机: </span>
                                <input ref={this.stuPhone} type="text" placeholder="请输入手机号码" />
                            </div>
                            <button  onClick={() => this.dealWithClick()}>新增学员</button>
                        </fieldset>
                    </div>
                )
            }
        
            //点击新增学员
            dealWithClick(){
                //1.读取用户输入的数据
                const name = this.stuName.current.value;
                const age = this.stuAge.current.value;
                const gender =this.stuGender.current.value;
                const phone = this.stuPhone.current.value;

                // 2. 数据的校验
                if (!name || !age || !gender || !phone) {
                    alert('输入的数据不能为空!');
                    return;
                }

                // 3. 添加数据
                this.props.addStudentArr({ name, age, gender, phone });

                // 4. 清除输入框中的数据
                this.stuName.current.value = '';
                this.stuAge.current.value = '';
                this.stuGender.current.value = '男';
                this.stuPhone.current.value = '';
            }
        }

        //3.子类-展示板块
        class List extends React.Component {

            //设置props中属性的类型
            //.isRequired必传值
            static propTypes = {
                studentArr: PropTypes.array.isRequired,
                delFormArr:PropTypes.func.isRequired
            }
            //渲染html元素
            render() {
                //console.log(this.props.studentArr)
                const { studentArr,delFormArr} = this.props
                return (
                    <div>
                        <table>
                            <thead>
                                <tr>
                                    <td>姓名</td>
                                    <td>性别</td>
                                    <td>年龄</td>
                                    <td>手机</td>
                                    <td>删除</td>
                                </tr>
                            </thead>
                            <tbody>
                                {
                                    studentArr.map((stu, index) => (
                                        <tr key={index}>
                                            <td>{stu.name}</td>
                                            <td>{stu.gender}</td>
                                            <td>{stu.age}</td>
                                            <td>{stu.phone}</td>
                                            <td>
                                                <button onClick={()=>delFormArr(index)}>删除</button>
                                            </td>
                                        </tr>
                                    ))
                                }

                            </tbody>
                        </table>
                    </div>
                )
            }
        }

        //4.渲染到浏览器页面显示
        ReactDOM.render(
            <Admin />,
            document.getElementById('admin')
        )
    </script>
</body>

</html>

效果展示:


信息录入系统.png
案例2:

ref称为非受控组件方式。以下案例采用受控方式实现数据绑定。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <style>
        #login {
            margin: 50px auto;
            width: 600px;
        }

        .containt {
            margin: 0 auto;
            border: 2px solid rgb(17, 17, 16);
            float: left;
            padding-top: 10px;

        }

        .userName {
            padding-top: 10px;
            padding-left: 10px;
        }

        .userPwd {
            padding-top: 10px;
            padding-left: 10px;
        }

        .login {
            padding-top: 10px;
            padding-bottom: 10px;
            text-align: center;
        }
    </style>
</head>

<body>
    <div id="login"></div>
    <script src="../js/react.development.js"></script>
    <script src="../js/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <script type="text/babel">
        //1.创建登录类
        class Login extends React.Component {
            constructor(props) {
                super(props);
                //初始化状态
                this.state = {
                    userName: '',
                    userPwd: ''
                }
            }
            render() {
                const { userName, userPwd } = this.state;
                return (
                    <form action="" onSubmit={() => this.login()}>
                        <div className="containt">
                            <div className="userName">
                                <span>用户名:</span>
                                <input type="text" value={userName} onChange={(e) => this.userChange(e)} />
                            </div>
                            <div className="userPwd">
                                <span>密 码:</span>
                                <input type="password" value={userPwd} onChange={(e) => this.pwdChange(e)} />
                            </div>
                            <div className="login">
                                <input type="submit" value="登录" />
                            </div>

                        </div>

                    </form>
                )
            }

            userChange(e) {
                // 1. 读取输入的用户名
                const userName = e.target.value;
                console.log(userName);
                // 2. 更新状态
                this.setState({
                    userName
                });
            }

            pwdChange(e) {
                // 1. 读取输入的用户名
                const userPwd = e.target.value;
                console.log(userPwd);
                // 2. 更新状态
                this.setState({
                    userPwd
                });
            }

            login() {
                // 1. 取出数据
                const { userName, userPwd } = this.state;
                alert(`用户名:${userName},密码:${userPwd}`);
                return;
            }
        }

        //渲染(挂载)
        ReactDOM.render(
            <Login />,
            document.getElementById('login')

        )

    </script>

</body>

</html>

效果:


登录页.png
上一篇下一篇

猜你喜欢

热点阅读