React学习案例

看视频学习的react基础,学习的过程中做了一些案例进行辅助学习,在此记录,方便自己回顾

1 react 初步使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hello_react</title>
</head>
<body>
    <!-- 准备好容器 -->
    <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
    // 1.创建虚拟dom
        // 此处不要写引号 因为不是字符串 是虚拟dom
        const VDOM = <h1 id="text">hello react</h1>
    // 2.渲染虚拟dom到页面
        ReactDOM.render(VDOM,document.getElementById('test'))

    </script>
</body>
</html>

2 创建虚拟Dom的两种方式

2.1 使用jsx创建

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>使用jsx创建</title>
</head>
<body>
    <!-- 准备好容器 -->
    <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
    // 1.创建虚拟dom
        // 此处不要写引号 因为不是字符串 是虚拟dom
        const VDOM = <h1>hello react</h1>
    // 2.渲染虚拟dom到页面
        ReactDOM.render(VDOM,document.getElementById('test'))
    </script>
</body>
</html>

2.2 使用js创建

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>使用js创建</title>
</head>
<body>
    <!-- 准备好容器 -->
    <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/javascript">
    // 1.创建虚拟dom
        // 此处不要写引号 因为不是字符串 是虚拟dom
        const VDOM = React.createElement('h1',{id:'title'},'hello react')
    // 2.渲染虚拟dom到页面
        ReactDOM.render(VDOM,document.getElementById('test'))
    </script>
</body>
</html>

3 虚拟Dom和真实Dom区别

    /*
        关于虚拟dom
            1.本质是object
            2.虚拟dom比较”轻“
            3.虚拟dom最终会被react转化为真实的dom
    */
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>虚拟真实</title>
</head>
<body>
    <!-- 准备好容器 -->
    <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
    // 1.创建虚拟dom
        // 此处不要写引号 因为不是字符串 是虚拟dom
        const VDOM = <h1 id="text">hello react</h1>
    // 2.渲染虚拟dom到页面
        ReactDOM.render(VDOM,document.getElementById('test'))

        const TDOM = document.getElementById("test")

        console.log('虚拟dom',VDOM);
        console.log('真实dom',TDOM);
        debugger;

    </script>
</body>
</html>

需要借助debugger能看出效果,真实dom身上的属性明显很多,真实dom如下
在这里插入图片描述
虚拟dom如下
在这里插入图片描述

4 jsx语法规则

4.1 jsx语法规则

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>jsx的语法规则</title>
    <style>
        .title{
            background-color: orange;
            width: 200px;
        }
    </style>
</head>
<body>
    <!-- 1.准备好一个容器 -->
    <div id="test"></div>
    <div id="test1"></div>

    <!-- 2.引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">

        const myId = 'Atguigu'
        const myData = 'Hello'

        //3.创建虚拟dom
        const VDOM = (
            <h2 id="atguigu">
                <span>jsx的语法规则</span>
            </h2>
        )

        const VDOM1 = (
            <div>
                <h2 id={myId.toLowerCase()} className='title'>
                <span style={{color:'white',fontSize:'29px'}}>{myData.toLowerCase()}</span>
                </h2>
                <input type='text'></input>
            </div>
        )

        //4.渲染虚拟dom到页面
        ReactDOM.render(VDOM,document.getElementById('test'))
        ReactDOM.render(VDOM1,document.getElementById('test1'))

        /*
        jsx语法规则
            1、定义虚拟DOM 不要写引号
            2、标签中混入js表达式用{}
            3、样式的类名指定不要用class,要用className
            4、内联样式,要用style={{key:value}}的形式去写
            5、只有一个根标签
            6、标签必须闭合
            7、标签首字母
                (1)、若小写字母开头,则将标签转为html中同名元素
                       若无改标签同名元素,则报错
                (2)、若大写字母开头,react就去渲染对应的组件,
                       若组件没有定义,则报错
        */
    </script>
    
</body>
</html>

4.2 jsx语法练习

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 1.准备好一个容器 -->
    <div id="test"></div>


    <!-- 2.引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">
        /*
            1.js表达式 (有一个返回值)
                (1)、a
                (2)、a+b
                (3)、demo(1)
                (4)、arr.map()
                (5)、function test(){}
                
            2.js语句 (改变代码走向)
                (1)、if(){}
                (2)、for(){}
                (3)、switch(){}
        =*/7
       const data=['aa','bb','cc']

    //    创建虚拟dom
       const VDOM = (
           <div>
                <h1>前端js框架列表</h1>
                <ul>
                    {data.map((item,index)=>{
                        return <li key={index}>{item}</li>
                    })}
                </ul>
            </div>
       )

    //    渲染虚拟dom
    ReactDOM.render(VDOM,document.getElementById('test'))
    </script>
</body>
</html>

5 文件中定义组件

5.1 函数式组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>函数式组件</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        // 1.创建函数式组件
        function MyComponent(){
            console.log(this) //这里的this  不是window ,因为babel解析的时候使用的是严格模式
            return <h2>我是函数式组件,适用于简单组件</h2>
        }

        // 2.渲染组件到页面
        ReactDOM.render(<MyComponent/>,document.getElementById('test'));

        /*
        过程
        1.React解析组件标签,找到MyComponent组件
        2.发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOM转化为真实DOM,呈现到页面
        */
    </script>

</body>
</html>

5.2 类式组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>类式组件</title>
</head>
<body>
         <!-- 准备好容器 -->
         <div id="test">
        
        </div>
        <!-- 引入js 注意顺序 -->
        <script type="text/javascript" src="../js/react.development.js"></script>
        <script type="text/javascript" src="../js/react-dom.development.js"></script>
        <script type="text/javascript" src="../js/babel.min.js"></script>
    
        <!-- 开始编码  此处一定要写babel-->
        <script type="text/babel">

        //1.创建类式组件
        class MyComponent extends React.Component{
            //render在MyComponent原型链对象上 供实例使用
            render(){
                return <h2>我是类式组件,适用于复杂组件</h2>
            }
        }

        //2.渲染到页面
        ReactDOM.render(<MyComponent/>,document.getElementById('test'))

        </script>
</body>
</html>

6 组件实例的三大属性state

6.1 js原生事件绑定

实现点即按钮提示
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="btn1">按钮1</button>
    <button id="btn2">按钮2</button>
    <button id="btn3" onclick="demo()">按钮3</button>

    <script type="text/javascript">
        const btn1 = document.getElementById('btn1')
        btn1.addEventListener('click',()=>{
            alert('按钮1')
        })

        const btn2 = document.getElementById('btn2')
        btn2.onclick = ()=>{
            alert('按钮2被点击了')
        }

        function demo(){
            alert('按钮3被点击了')
        }
    </script>
</body>
</html>

6.2 state标准方式

实现点即切换
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 准备好容器 -->
    <div id="test">

    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        //创建组件
        class Weather extends React.Component{
            constructor(prop){
                super(prop)
                //初始化状态 
                this.state = {isHot : false,wind : '微风'}
                
                
                //右侧: 先找到原型链上的changeWeather方法
                //      bind方法改变this 的指向
                //      最后返回一个新的属性changgeWeather
                //      新的属性changgeWeather 可以通过this调用
                this.changeWeather = this.changeWeather.bind(this)

            }

            render(){
                //读取状态
                const {isHot,wind} = this.state
                
                return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热':"凉爽"},{wind}</h1>
            }
            
            //changeWeather 方法是放在Weather的原型链上
            changeWeather(){
                //获取原来的状态
                const isHot = this.state.isHot
                //修改状态 必须要用setState
                this.setState({isHot:!isHot})
            }
        }
        //渲染
        ReactDOM.render(<Weather/>,document.getElementById('test'))
        
       
        /*
        注意点3
            1、onClick          大写问题
            2、不用‘’ 用{}      取值问题
            3、changeWeather   后面不加() 不会执行函数
        使用步骤
            1、在类中写方法 注意修改状态要用setstate
            2、构造器中原型链上的方法转化为实体方法 改变this的指向
            3、虚拟DOM中点击调用
        */
    </script>
</body>
</html>

6.3 state简写方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 准备好容器 -->
    <div id="test">

    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        //创建组件
        class Weather extends React.Component{
            // constructor(prop){
            //     super(prop)
            //     state = {isHot : false,wind : '微风'}
            //     this.changeWeather = this.changeWeather.bind(this)
            // }


            //修改1:state 放外面作为类的一个属性 即初始化
            state = {isHot : false,wind : '微风'}

            //修改2:自定义方法
            //赋值语句 将changeWeather变为类的属性
            //箭头函数没有 this ,向上一层找this
            //以后类中自定义方法都要写成赋值语句 + 箭头函数
            changeWeather = () =>{
                const isHot = this.state.isHot
                this.setState({isHot:!isHot})
            }

            render(){
                const {isHot,wind} = this.state
                return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热':"凉爽"},{wind}</h1>
            }
            
        }
        //渲染
        ReactDOM.render(<Weather/>,document.getElementById('test'))
        
       
    </script>
</body>
</html>

7 组件实例的三大属性props

7.1 props的基本使用

实现如下数据传递
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>props基本使用 对props进行限制</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test1">
        
    </div>
    <div id="test2">
        
    </div>
    <div id="test3">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        /*
        *  使用props 传递值
        */
        class People extends React.Component{
            render(){

                const {name,sex,age} = this.props
                return(
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age + 1}</li>
                    </ul>
                )
            }
        }

        ReactDOM.render(<People name="tom" sex="男" age={18}/>,document.getElementById('test1'))
        ReactDOM.render(<People name="lc" sex="女" age={19}/>,document.getElementById('test2'))
        /*
        *  批量渲染
        */
        const p = {name:'老刘',age:18,sex:'女'}
        ReactDOM.render(<People{...p}/>,document.getElementById('test3'))

    </script>

    
</body>
</html>

7.2 三点运算符复习

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>三点运算符</title>
</head>
<body>
    <script type="text/javascript">
        let arr1 = [1,2,3]
        let arr2 = [2,3,4]
        let arr3 = [...arr1,...arr2]
        console.log(...arr3)

        //在函数中使用
        function sum(...nums){
            return nums.reduce((preValue,currentValue)=>{
                return preValue + currentValue
            })
        }
        console.log(sum(1,2,3,4,5))

        //构造字面量对象时展开
        let person1 = {name:'tom',age:18}
        let person2 = {...person1,name:'haah',home:'shanghai'}
        console.log(person1)
        console.log(person2)
    </script>
</body>
</html>

7.3 props实现限制

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对props进行限制</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test1">
        
    </div>
    <div id="test2">
        
    </div>
    <div id="test3">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 引入prop-types -->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        /*
        *  使用props 传递值
        *   props是只读的
        */
        class People extends React.Component{
            render(){
                //props是只读的
                const {name,sex,age} = this.props
                return(
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                )
            }
        }
        /*
          问题1;年龄总体加1;age就不可以用字符串的形式,用{}
          解决: 对props进行限制
                 必要性限制
                 类型限制
                 默认值限制
        */

        //指定标签的属性     
        People.propTypes = {
            name:PropTypes.string.isRequired, //名字为字符串 是必须的
            sex:PropTypes.string,
            age:PropTypes.number,
            speak:PropTypes.func, //speak 必须为方法
        }

        // 指定标签的默认值
        People.defaultProps = {
            sex:'不男不女',
            age:18
        }

        ReactDOM.render(<People name="tom" sex="男"  speak={speak()}/>,document.getElementById('test1'))
        ReactDOM.render(<People name="lc"  age={19}/>,document.getElementById('test2'))
        /*
        *  批量渲染
        */
        const p = {name:'老刘',age:18,sex:'女'}
        ReactDOM.render(<People{...p}/>,document.getElementById('test3'))
        
        function speak(){
            console.log("说话")
        }
    //    注意 string  s不要大写
    </script>

    
</body>
</html>

7.4 props简写方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对props进行限制</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test1">
        
    </div>
    <div id="test2">
        
    </div>
    <div id="test3">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 引入prop-types -->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        /*
        *  使用props 传递值
        *   props是只读的
        */
        class People extends React.Component{

                    //指定标签的属性     
            static propTypes = {
                name:PropTypes.string.isRequired, //名字为字符串 是必须的
                sex:PropTypes.string,
                age:PropTypes.number,
                speak:PropTypes.func, //speak 必须为方法
            }

            // 指定标签的默认值
            static defaultProps = {
                sex:'不男不女',
                age:18
            }

            //初始化状态
            state = {}

            render(){
                //props是只读的
                const {name,sex,age} = this.props
                return(
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                )
            }
        }




        ReactDOM.render(<People name="tom" sex="男"  speak={speak()}/>,document.getElementById('test1'))
        ReactDOM.render(<People name="lc"  age={19}/>,document.getElementById('test2'))
        /*
        *  批量渲染
        */
        const p = {name:'老刘',age:18,sex:'女'}
        ReactDOM.render(<People{...p}/>,document.getElementById('test3'))
        
        function speak(){
            console.log("说话")
        }
    </script>

    
</body>
</html>

7.5 函数时组件使用props

实现如下数据传递
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对props进行限制</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test1">
        
    </div>
    <div id="test2">
        
    </div>
    <div id="test3">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 引入prop-types -->
    <script type="text/javascript" src="../js/prop-types.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">



        // 函数式组件
        function Person(props){
            const {name,sex,age} = props
            return (
                    <ul>
                        <li>姓名:{name}</li>
                        <li>性别:{sex}</li>
                        <li>年龄:{age}</li>
                    </ul>
                    )
        }
        //限制
        //指定标签的属性     
        Person.propTypes = {
            name:PropTypes.string.isRequired, //名字为字符串 是必须的
            sex:PropTypes.string,
            age:PropTypes.number,
        }

        // 指定标签的默认值
        Person.defaultProps = {
            sex:'不男不女',
            age:18
        }



        ReactDOM.render(<Person name="tom" />,document.getElementById('test1'))


    </script>

    
</body>
</html>

8 组件实例的三大属性refs

8.1 refs字符串实现

按照要求实现数据提示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>字符串实现</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        //创建组件类
        class Demo extends React.Component{

            showdata1 = ()=>{
                console.log(this)
                const {input1} = this.refs
                alert(input1.value)
            }

            showdata2 = ()=>{
                console.log(this)
                const {input2} = this.refs
                alert(input2.value)
            }

            render(){
                return(
                    <div>
                        <input type="text" placeholder="点击按钮提示数据" ref="input1"/>&nbsp;
                        <button onClick={this.showdata1}>点击提示数据</button>&nbsp;
                        <input type="text" onBlur={this.showdata2} placeholder="失去焦点提示数据" ref="input2"/>
                    </div>

                )
            }
        } 
        //渲染
        ReactDOM.render(<Demo/>,document.getElementById('test'))
    </script>
</body>
</html>

8.2 refs回调函数实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>字符串实现</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        //创建组件类
        class Demo extends React.Component{

            showdata1 = ()=>{
                console.log(this)
                //input1 变为类实例的一个属性了 直接从 this上取即可
                const {input1} = this
                alert(input1.value)
            }

            showdata2 = ()=>{
                console.log(this)
                const {input2} = this
                alert(input2.value)
            }

            render(){
                return(
                    <div>
                        <input type="text" placeholder="点击按钮提示数据" ref={c => this.input1 = c}/>&nbsp;
                        <button onClick={this.showdata1}>点击提示数据</button>&nbsp;
                        <input type="text" onBlur={this.showdata2} placeholder="失去焦点提示数据" ref={c => this.input2 = c}/>
                    </div>

                )
            }
        } 
        //渲染
        ReactDOM.render(<Demo/>,document.getElementById('test'))
    </script>
</body>
</html>

8.3 createref实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>字符串实现</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        //创建组件类
        class Demo extends React.Component{

            //通过creatRef创建一个容器用来存
            myRef1 = React.createRef();
            myRef2 = React.createRef();
            showdata1 = ()=>{
                console.log(this.myRef1.current.value)
                //input1 变为类实例的一个属性了 直接从 this上取即可
               
            }

            showdata2 = ()=>{
                console.log(this.myRef2.current.value)
            }

            render(){
                return(
                    <div>
                        {/* 把这个标签 存入实体类中的myRef属性中*/}
                        <input type="text" placeholder="点击按钮提示数据" ref={this.myRef1}/>&nbsp;
                        <button onClick={this.showdata1}>点击提示数据</button>&nbsp;
                        <input type="text" onBlur={this.showdata2} placeholder="失去焦点提示数据" ref={this.myRef2}/>
                    </div>

                )
            }
        } 
        //渲染
        ReactDOM.render(<Demo/>,document.getElementById('test'))
    </script>
</body>
</html>

8.4 react事件处理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>字符串实现</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        
        class Demo extends React.Component{
            /**
             1.	通过onXxx属性指定事件处理函数(注意大小写)
                1)	React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
                2)	React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
             2.	通过event.target得到发生事件的DOM元素对象

             尽量避免ref的使用
             * */
           
            myRef1 = React.createRef();
            myRef2 = React.createRef();
            showdata1 = ()=>{
                console.log(this.myRef1.current.value)
                
               
            }
            //传入 event
            showdata2 = (event)=>{
                console.log(event.target.value)
            }

            render(){
                return(
                    <div>
                        {/* 把这个标签 存入实体类中的myRef属性中*/}
                        <input type="text" placeholder="点击按钮提示数据" ref={this.myRef1}/>&nbsp;
                        <button onClick={this.showdata1}>点击提示数据</button>&nbsp;
                        {/* 发生事件的DOM元素和要操作的DOM元素是一个可以不写ref*/}
                        <input type="text" onBlur={this.showdata2} placeholder="失去焦点提示数据"/>
                    </div>

                )
            }
        } 
        //渲染
        ReactDOM.render(<Demo/>,document.getElementById('test'))
    </script>
</body>
</html>

9 收集表单数据

9.1 非受控组件

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>非受控组件 现用现取</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        class Login extends React.Component{

            handleSubmit = (event) =>{
                //组织默认事件
                event.preventDefault()
                const {uname,upword} = this
                alert(uname.value)
            }

            render(){
                return (<form action="wwww.baidu.com" onSubmit={this.handleSubmit}>
                          用户名:<input type="text" name="uname" ref={c => this.uname = c}/>
                          密码:<input type="password" name="upword" ref={c => this.upword = c}/>
                          <button>登入</button>
                        </form>)
            }
        }

        ReactDOM.render(<Login/>,document.getElementById('test'))
    </script>
</body>
</html>

9.2 受控组件

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>受控组件,页面中所有输入的dom,把输入数据维护到state,使用的时候从state中取</title>
</head>
<body>
     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">
        class Login extends React.Component{

            //初始胡 
            state = {
                username:'', //用户名
                password:''  //密码
            }

            //保存到状态中
            saveUsername = (event)=>{
                this.setState({username:event.target.value})
            }

            savePassword = (event)=>{
                this.setState({password:event.target.value})
            }

            handleSubmit = (event) =>{
                //组织默认事件
                event.preventDefault()
                const {username,password} = this.state
                alert(username)
            }

            render(){
                return (<form action="wwww.baidu.com" onSubmit={this.handleSubmit}>
                          用户名:<input onChange={this.saveUsername} type="text" name="uname"/>
                          密码:<input onChange={this.savePassword} type="password" name="upword"/>
                          <button>登入</button>
                        </form>)
            }
        }

        ReactDOM.render(<Login/>,document.getElementById('test'))
    </script>
</body>
</html>

10 高级函数和函数柯里化

10.1 高级函数和函数柯里化

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>高阶函数   函数柯里化</title>
</head>
<body>


     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">

        /*

        高阶函数:如果一个函数符合下面2个中的任意一个 那该函数就是高阶函数
            1.若A函数 接收的参数时一个函数,那么A就可以称之为高阶函数
            2.若A函数 调用的返回值依然是一个函数,那么A就可以称之为高阶函数
        
        函数柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码方式

        */


        class Login extends React.Component{

            //初始胡 
            state = {
                username:'', //用户名
                password:''  //密码
            }

            //保存到状态中 是高阶函数 满足函数柯里化
            saveFormData = (dateType)=>{
                return (event)=>{
                    this.setState({[dateType]:event.target.value})
                }
            }

            handleSubmit = (event) =>{
                //组织默认事件
                event.preventDefault()
                const {username,password} = this.state
                alert(username)
            }

            render(){
                return (<form action="wwww.baidu.com" onSubmit={this.handleSubmit}>
                          用户名:<input onChange={this.saveFormData('username')} type="text" name="uname"/>
                          密码:<input onChange={this.saveFormData('password')} type="password" name="upword"/>
                          <button>登入</button>
                        </form>)
            }
        }

        ReactDOM.render(<Login/>,document.getElementById('test'))
    </script>
</body>
</html>

10.2 不用函数柯里化

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>高阶函数   函数柯里化</title>
</head>
<body>


     <!-- 准备好容器 -->
     <div id="test">
        
    </div>
    <!-- 引入js 注意顺序 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 开始编码  此处一定要写babel-->
    <script type="text/babel">

        /*

        高阶函数:如果一个函数符合下面2个中的任意一个 那该函数就是高阶函数
            1.若A函数 接收的参数时一个函数,那么A就可以称之为高阶函数
            2.若A函数 调用的返回值依然是一个函数,那么A就可以称之为高阶函数
        
        函数柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码方式

        */


        class Login extends React.Component{

            //初始胡 
            state = {
                username:'', //用户名
                password:''  //密码
            }

            //保存到状态中 是高阶函数 满足函数柯里化
            saveFormData = (dateType,event)=>{
                
                this.setState({[dateType]:event.target.value})
            
            }

            handleSubmit = (event) =>{
                //组织默认事件
                event.preventDefault()
                const {username,password} = this.state
                alert(username)
            }

            render(){
                return (<form action="wwww.baidu.com" onSubmit={this.handleSubmit}>
                          用户名:<input onChange={(event) =>{this.saveFormData('username',event)}} type="text" name="uname"/>
                          密码:<input onChange={(event)=>{this.saveFormData('password',event)}} type="password" name="upword"/>
                          <button>登入</button>
                        </form>)
            }
        }

        ReactDOM.render(<Login/>,document.getElementById('test'))
    </script>
</body>
</html>
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值