zoukankan      html  css  js  c++  java
  • React技术栈-组件组合使用实战案例

            React技术栈-组件组合使用实战案例

                                      作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

    一.功能界面的组件化编码流程

      拆分组件: 
        拆分界面,抽取组件
      实现静态组件:
        使用组件实现静态页面效果,没有动态数据和交互。
      实现动态组件     实现动态显示初始化数据     实现交互功能(从绑定事件监听开始)

    二.实战案例

    1>.HTML源代码

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>组件组合使用</title>
        </head>
        <body>
            <div id="box1"></div>
        </body>
        
        <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/prop-types.js"></script>
        <script type="text/javascript" src="../js/babel.min.js"></script>
        
        <script type="text/babel">
            /**
             *    问题1:数据保存在哪个组件内?
             *        看数据是某个组件需要(给它),还是某些组件需要(给共同的父组件)
             *
             *    问题2:需要在子组件中改变父组件的状态
             *        子组件中不能直接改变父组件的状态,状态在哪个组件,更新状态的行为(函数)就应该定义在哪个组件
             *        解决方案:父组件定义函数,传递给子组件,子组件调用
                */
            
            
            //1>.定义组件
            class MyApp extends React.Component{
                constructor(props){
                    super(props);
                    
                    //初始化状态
                    this.state = {
                        myAppTodos:["抽烟","喝酒","斗地主"]
                    }
                    
                    //绑定this(当前组件)
                    this.addTodo = this.addTodo.bind(this)
                }
                
                addTodo(todo){
                    //this.state.todos.unshift(todo)      //不能这么做,应该按照下面的方法更新
                    const {myAppTodos} = this.state
                    myAppTodos.unshift(todo)
                    
                    //更新状态
                    this.setState({myAppTodos})
                }
                
                render(){
                    //解构赋值,为了下面调用方便
                    const {myAppTodos} = this.state
                    return (
                        <div>
                            <h1>Simple TODO List</h1>
                            <MyAdd count={myAppTodos.length} addTodo={this.addTodo}/>
                            <MyList todos={myAppTodos}/>
                        </div>
                    )
                }
            }
            
            class MyAdd extends React.Component{
                constructor(props){
                    super(props);
                    
                    this.add = this.add.bind(this);
                }
                
                add(){
                    //1>.读取输入的数据
                    const todo = this.todoInput.value.trim();
                    //2>.检查输入的合法性
                    if (!todo){
                        return;
                    }
                    //3>.添加数据
                    this.props.addTodo(todo);
                    //4>.清除输入
                    this.todoInput.value = "";
                }
                
                render(){
                    return (
                        <div >
                            <input type="text" ref={input => this.todoInput = input}/>&nbsp;&nbsp;&nbsp;
                            <button onClick={this.add}>add ${this.props.count + 1}</button>
                        </div>
                    )
                }
            }
            
            //声明MyList这个组件必须有count和addTodo属性(props)
            MyAdd.propTypes = {
                count:PropTypes.number.isRequired,
                addTodo:PropTypes.func.isRequired
            }
            
            class MyList extends React.Component{
                //初始化显示动态数据
                render(){
                    //解构赋值,为了下面调用方便
                    const {todos} = this.props
                    return (
                        <div>
                            <ul>
                                {
                                    todos.map((todo,index) => <li key={index}>{todo}</li> )
                                }
                            </ul>
                        </div>
                    )
                }
            }
            
            //声明MyList这个组件必须有一个todos属性(props)
            MyList.propTypes = {
                todos:PropTypes.array.isRequired            
            }
            
            //2>.渲染组件标签
            ReactDOM.render(<MyApp />,document.getElementById("box1"))
        </script>
    </html>

    2>.浏览器打开以上代码渲染结果

    打开页面如上图所示,我们可以添加数据,当数据添加成功后会打印在当前列表页面,如下图所示。

  • 相关阅读:
    JAVA课程课后作业之使用递归完成回文
    原码、补码,反码以及JAVA中数值采用哪种码表示
    JAVA课后作业01
    java开学考试有感以及源码
    自动生成30道小学四则运算题目
    统计文档中单词出现频率
    JAVA课程课后作业03之动手动脑
    暑假假期周进度报告(第八周)
    字节流FileInputStream FileOutputStream四种读写,包装流BufferedOutputStream BufferedInputSream 缓冲区默认8192字节
    多态性
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/12094509.html
Copyright © 2011-2022 走看看