React基本案例

1.todoList

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ToDoList</title>
    <script src="../common/react/development.js"></script>
    <script src="../common/react-dom/development.js"></script>
    <script src="../common/babel.js"></script>
    <script src="../common/prop-types.js"></script>
</head>
<body>

<div id="app1"></div>

<script type="text/babel">

    /*
        需求:
            1.点击按钮提示第一个输入框的值
        功能界面的组件化编码流程
            1.拆分组件
            2.实现静态组件
            3.实现动态组件
                动态显示初始化内容
                交互功能(绑定事件监听)
        问题:数据保存到哪个组件?
            看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
        问题:如何在子组件中改变父组件的状态?
            子组件不能直接改变父组件的状态
            状态在哪个组件,更新状态的行为就应该定义在哪个组件
            解决:父组件定义函数传递给子组件
        错误:
            将字符串的ref用法和函数式的ref用法搞错了
     */

    //ES6类组件
    const App = class extends React.Component{

        constructor(props){
            super(props);
            //初始化状态
            this.state = {
                todos:['吃饭','睡觉','豆豆','刷完','洗澡']
            };
            this.addTodo = this.addTodo.bind(this);
        }

        addTodo(item){
            const {todos} = this.state;
            todos.unshift(item);
            //更新状态
            this.setState(
                {todos}
            );
        }

        render(){

            const {todos:doList} = this.state;

            return(
                <div>
                    <h1>Simple ToDo List</h1>
                    <Add count={doList.length} addTodo={this.addTodo}/>
                    <List todos={doList}/>
                </div>
            );
        }
    };

    //自定义Add组件
    const Add = class extends React.Component{

        constructor(props){
            super(props);
            this.handleAdd = this.handleAdd.bind(this);
        }

        handleAdd(){
            console.log("handleAdd--->",this);
            //1.读取输入的数据
            const item = this.todoinput.value.trim();
            //2.检查合法性
            if(!item){
                return
            }
            //3.添加元素
            const {addTodo} = this.props;
            addTodo(item);
            this.todoinput.value='';
        }

        render(){

            const {count} = this.props;

            return(
                <div>
                    <input ref={node=>this.todoinput=node} type="text"/>
                    <button ref="dddd" onClick={this.handleAdd}>add #{count+1}</button>
                </div>
            );
        }
    };

    Add.propTypes = {
        count:PropTypes.number.isRequired,
        addTodo:PropTypes.func.isRequired
    };

    const List = class extends React.Component{

        constructor(props){
            super(props);
        }

        render(){

            const {todos:doList} = this.props;

            return(
                <div>
                    <ul>
                        {
                            doList.map((item,index)=>{ return <li key={index}>{item}</li>})
                        }
                    </ul>
                </div>
            );
        }
    };

    //声明数据类型
    List.propTypes = {
        todos:PropTypes.array.isRequired
    };


    ReactDOM.render(<App/>, document.getElementById('app1'));


</script>


</body>
</html>

2.loginForm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>LoginForm</title>
    <script src="../common/react/development.js"></script>
    <script src="../common/react-dom/development.js"></script>
    <script src="../common/babel.js"></script>
    <script src="../common/prop-types.js"></script>
</head>
<body>

<div id="app1"></div>

<script type="text/babel">

    /*
        需求:
            1.点击按钮提示第一个输入框的值
        功能界面的组件化编码流程
            1.拆分组件
            2.实现静态组件
            3.实现动态组件
                动态显示初始化内容
                交互功能(绑定事件监听)
        问题:数据保存到哪个组件?
            看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
        问题:如何在子组件中改变父组件的状态?
            子组件不能直接改变父组件的状态
            状态在哪个组件,更新状态的行为就应该定义在哪个组件
            解决:父组件定义函数传递给子组件
        错误:
            将字符串的ref用法和函数式的ref用法搞错了
        概念:
            受控组件:
                可以自动收集组件值到状态中去
            非受控组件:
                需要时候自己去拿组件的值
     */

   const LoginForm = class extends React.Component{

       constructor(props){
           super(props);
           this.state = {
               pwd:'',
           };
           this.handleSubmit = this.handleSubmit.bind(this);
           this.handlePwdChange = this.handlePwdChange.bind(this);
       }

       handleSubmit(e){
           console.log("handleSubmit--->",this);
           //阻止表单的默认提交
            e.preventDefault();
            const username = this.nameInput.value.trim();
            alert(`准备提交的用户名:${username},密码:${this.state.pwd}`);
       }

       handlePwdChange(e){
            const pwd = e.target.value.trim();
            this.setState({pwd});
       }

       render(){
           return(
           <div>
               <form action="/test" onSubmit={this.handleSubmit}>
                   用户名:<input ref={ins=>this.nameInput=ins} type="text"/>
                   密  码:<input type="password" value={this.state.pwd} onChange={this.handlePwdChange}/>
                   <input type="submit" value="登录"/>
               </form>
           </div>)
       }

   };


    ReactDOM.render(<LoginForm/>, document.getElementById('app1'));


</script>


</body>
</html>

3.clock

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Clock</title>
    <script src="../common/react/development.js"></script>
    <script src="../common/react-dom/development.js"></script>
    <script src="../common/babel.js"></script>
    <script src="../common/prop-types.js"></script>
</head>
<body>

<div id="app1"></div>

<script type="text/babel">

    /*

        功能界面的组件化编码流程
            1.拆分组件
            2.实现静态组件
            3.实现动态组件
                动态显示初始化内容
                交互功能(绑定事件监听)
        问题:数据保存到哪个组件?
            看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
        问题:如何在子组件中改变父组件的状态?
            子组件不能直接改变父组件的状态
            状态在哪个组件,更新状态的行为就应该定义在哪个组件
            解决:父组件定义函数传递给子组件
        错误:
            将字符串的ref用法和函数式的ref用法搞错了
        概念:
            受控组件:
                可以自动收集组件值到状态中去
            非受控组件:
                需要时候自己去拿组件的值
     */

    /*
        生命周期(钩子函数)

        1.初始化
            componentWillMont():挂载之前-将要插入DOM时候回调
            Render():挂载
            componentDidMont():挂载之后-已经插入DOM时候回调
        2.更新
            componentWillUpdate():
            this.setState()-Render():更新重新渲染
            componentDidUpdate():
        3.销毁
            componentWillUnmount():卸载之前
            unmountComponentAtNode():卸载
        重要的勾子函数
            render():渲染页面
            componentDidMount():开启监听发送ajax请求
            componentWillUnmount():做一些收尾的工作例如清理定时器
            componentWillReceiveProps():后面讲

     */

    const Clock = class extends React.Component{
        constructor(props){
            super(props);
            //状态初始化
            this.state = {
                date:new Date().toLocaleString()
            }
        }

        componentDidMount(){
            setInterval(()=>{
                this.setState({date:new Date().toLocaleString()})
            },1000);
        }

        render(){
            const {date} = this.state;
            return(
                <div>时间:{date}</div>
            )
        }
    };


    ReactDOM.render(<Clock />, document.getElementById('app1'));


</script>


</body>
</html>

4.animal

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>LoginForm</title>
    <script src="../common/react/development.js"></script>
    <script src="../common/react-dom/development.js"></script>
    <script src="../common/babel.js"></script>
    <script src="../common/prop-types.js"></script>
</head>
<body>

<div id="app1"></div>

<script type="text/babel">

    /*

        功能界面的组件化编码流程
            1.拆分组件
            2.实现静态组件
            3.实现动态组件
                动态显示初始化内容
                交互功能(绑定事件监听)
        问题:数据保存到哪个组件?
            看数据哪些组件需要,如果多个需要操作数据就放到共同父类组件里面
        问题:如何在子组件中改变父组件的状态?
            子组件不能直接改变父组件的状态
            状态在哪个组件,更新状态的行为就应该定义在哪个组件
            解决:父组件定义函数传递给子组件
        错误:
            将字符串的ref用法和函数式的ref用法搞错了
        概念:
            受控组件:
                可以自动收集组件值到状态中去
            非受控组件:
                需要时候自己去拿组件的值
     */

    /*
        生命周期(钩子函数)

        1.初始化
            componentWillMont():挂载之前-将要插入DOM时候回调
            Render():挂载
            componentDidMont():挂载之后-已经插入DOM时候回调
        2.更新
            componentWillUpdate():
            this.setState()-Render():更新重新渲染
            componentDidUpdate():
        3.销毁
            componentWillUnmount():卸载之前
            unmountComponentAtNode():卸载
        重要的勾子函数
            render():渲染页面
            componentDidMount():开启监听发送ajax请求
            componentWillUnmount():做一些收尾的工作例如清理定时器
            componentWillReceiveProps():后面讲

     */

   class Life extends React.Component{

       constructor(props){
           super(props);
           this.state = {
               opacity:1
           };
           this.destroyComponent = this.destroyComponent.bind(this);
       }

       //即将挂载
       //Render之前
       componentWillMount(){
           console.log("componentWillMount-即将挂载",this);
       }

       //内置函数,this指向类
       //render之后
       componentDidMount(){
           console.log("componentDidMount-挂载之后",this);
           this.clockId = setInterval(function () {
               console.log("clock working...");
               let {opacity} = this.state;
               opacity -= 0.1;
               if(opacity<=0){
                   opacity = 1;
               }
               this.setState({opacity});
           }.bind(this),200);
       }

       //即将更新
       //this.setState()之前
       componentWillUpdate(){
           console.log("componentWillUpdate-更新之前",this);
       }

       //更新之后
       //this.setState()之后
       componentDidUpdate(){
           console.log("componentDidUpdate-更新之后",this);
       }

       //内置函数,this指向类
       //卸载之前
       componentWillUnmount(){
           console.log("clock stop...");
           clearInterval(this.clockId);
       }

       //点击按钮卸载定时器
       //卸载之后只是界面卸载
       //定时器还在执行
       destroyComponent(){
           //ReactDom提供的卸载组件的接口
           ReactDOM.unmountComponentAtNode(document.getElementById('app1'));
       }

       render(){
           const {msg} = this.props;
           const {opacity} = this.state;
           const style = {opacity};
           return(
               <div>
                   <h2 style={style}>{msg}</h2>
                   <button onClick={this.destroyComponent}>卸载动画</button>
               </div>
           )
       }

   }

    ReactDOM.render(<Life msg="Hello React"/>, document.getElementById('app1'));


</script>


</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花生糖葫芦侠

创作不易,请多多支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值