• React 1-6


    the official React documentation: https://reactjs.org/

    Here's the finished source code: https://codepen.io/anon/pen/MELQaQ

    2.14 Arrow Function:

    const print = (name) =>{
    
     console.log(name);
    
    }

    only one argument: 只有一个参数可以省略括号

    const print = name =>{
    
     console.log(name);
    
    }

    no arg:

    const print = () =>{}
    const multiply = number => number * 2
    
    console.log(multiply(2));

     3. Export Import

     Classes, Properties and Method

    class Person extends Human {
      constructor(){
        super();
        this.name='max';
      }
       printMyName() {
         console.log(this.name);
         
       }
        
      }

    等于

    class Person extends Human{
      
      name='max';
    
      print = () => console.log(this.name);
      
    }

     3.39 Props &State

     3.43 manipulating state

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    
    class App extends Component {
      state = {
        persons: [
          { name: 'Max', age: 28 },
          { name: 'Manu', age: 29 },
          { name: 'Stephanie', age: 26 }
        ],
        otherState: 'some other value'
      };
    
      switchNameHandler = () => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState({
          persons: [
            { name: 'Maximilian', age: 28 },
            { name: 'Manu', age: 29 },
            { name: 'Stephanie', age: 27 }
          ]
        });
      };
    
      render() {
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
            <p>This is really working!</p>
            <button onClick={this.switchNameHandler}>Switch Name</button>
            <Person
              name={this.state.persons[0].name}
              age={this.state.persons[0].age}
            />
            <Person
              name={this.state.persons[1].name}
              age={this.state.persons[1].age}
            >
              My Hobbies: Racing
            </Person>
            <Person
              name={this.state.persons[2].name}
              age={this.state.persons[2].age}
            />
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

    person.js

    import React from 'react';
    
    const person = ( props ) => {
        return (
            <div>
                <p>I'm {props.name} and I am {props.age} years old!</p>
                <p>{props.children}</p>
            </div>
        )
    };
    
    export default person;

    class-based

    因为用()=>这种语法 给一个property一个function 所以this可以用 否则不可以

    {this.switchNameHandler}不加括号,加了是瞬间渲染的,不加是调用时作为reference

    click={this.switchNameHandler.bind(this, 'Max!')} bind 后面是一个参数列表传进function

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    
    class App extends Component {
      state = {
        persons: [
          { name: 'Max', age: 28 },
          { name: 'Manu', age: 29 },
          { name: 'Stephanie', age: 26 }
        ],
        otherState: 'some other value'
      }
    
      switchNameHandler = (newName) => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState( {
          persons: [
            { name: newName, age: 28 },
            { name: 'Manu', age: 29 },
            { name: 'Stephanie', age: 27 }
          ]
        } )
      }
    
      nameChangedHandler = (event) => {
        this.setState( {
          persons: [
            { name: 'Max', age: 28 },
            { name: event.target.value, age: 29 },
            { name: 'Stephanie', age: 26 }
          ]
        } )
      }
    
      render () {
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
            <p>This is really working!</p>
            <button onClick={() => this.switchNameHandler('Maximilian!!')}>Switch Name</button>
            <Person 
              name={this.state.persons[0].name} 
              age={this.state.persons[0].age} />
            <Person 
              name={this.state.persons[1].name} 
              age={this.state.persons[1].age}
              click={this.switchNameHandler.bind(this, 'Max!')}
              changed={this.nameChangedHandler} >My Hobbies: Racing</Person>
            <Person 
              name={this.state.persons[2].name} 
              age={this.state.persons[2].age} />
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

     

    import React from 'react';
    
    const person = ( props ) => {
        return (
            <div>
                <p onClick={props.click}>I'm {props.name} and I am {props.age} years old!</p>
                <p>{props.children}</p>
                <input type="text" onChange={props.changed} value={props.name} />
            </div>
        )
    };
    
    export default person;

    two way binding

    3.48 Adding Styling

    需要import css into js file

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    
    class App extends Component {
      state = {
        persons: [
          { name: 'Max', age: 28 },
          { name: 'Manu', age: 29 },
          { name: 'Stephanie', age: 26 }
        ],
          otherState: 'some other value',
          showPersons: false
      }
    
      switchNameHandler = (newName) => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState( {
          persons: [
            { name: newName, age: 28 },
            { name: 'Manu', age: 29 },
            { name: 'Stephanie', age: 27 }
          ]
        } )
      }
    
      nameChangedHandler = (event) => {
        this.setState( {
          persons: [
            { name: 'Max', age: 28 },
            { name: event.target.value, age: 29 },
            { name: 'Stephanie', age: 26 }
          ]
        } )
      }
    
        togglePersonsHandler = () => {
    
            const doesShow = this.state.showPersons;
            this.setState({showPersons: !doesShow});
    
        }
    
        render() {
            const style = {
                backgroundColor: 'white',
                font: 'inherit',
                border: '1px solid blue',
                padding: '8px',
                cursor:'pointer'
    
    
            };
    
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
            <p>This is really working!</p>
                <button
                    style={style}
                    onClick={this.togglePersonsHandler}>Switch Name</button>
                {   
                    this.state.showPersons ? 
                    <div >
                    <Person
                        name={this.state.persons[0].name}
                        age={this.state.persons[0].age} />
                    <Person
                        name={this.state.persons[1].name}
                        age={this.state.persons[1].age}
                        click={this.switchNameHandler.bind(this, 'Max!')}
                        changed={this.nameChangedHandler} >My Hobbies: Racing</Person>
                    <Person
                        name={this.state.persons[2].name}
                        age={this.state.persons[2].age} />
    
                    </div> :null
                }
    
              
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

    more elelgant way 判断

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    
    class App extends Component {
      state = {
        persons: [
          { name: 'Max', age: 28 },
          { name: 'Manu', age: 29 },
          { name: 'Stephanie', age: 26 }
        ],
          otherState: 'some other value',
          showPersons: false
      }
    
      switchNameHandler = (newName) => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState( {
          persons: [
            { name: newName, age: 28 },
            { name: 'Manu', age: 29 },
            { name: 'Stephanie', age: 27 }
          ]
        } )
      }
    
      nameChangedHandler = (event) => {
        this.setState( {
          persons: [
            { name: 'Max', age: 28 },
            { name: event.target.value, age: 29 },
            { name: 'Stephanie', age: 26 }
          ]
        } )
      }
    
        togglePersonsHandler = () => {
    
            const doesShow = this.state.showPersons;
            this.setState({showPersons: !doesShow});
    
        }
    
        render() {
            const style = {
                backgroundColor: 'white',
                font: 'inherit',
                border: '1px solid blue',
                padding: '8px',
                cursor:'pointer'
    
    
            };
    
            let persons = null;
            if(this.state.showPersons){
                persons = (
                        <div>
                            <Person
                                name={this.state.persons[0].name}
                                age={this.state.persons[0].age} />
                            <Person
                                name={this.state.persons[1].name}
                                age={this.state.persons[1].age}
                                click={this.switchNameHandler.bind(this, 'Max!')}
                                changed={this.nameChangedHandler} >My Hobbies: Racing</Person>
                            <Person
                                name={this.state.persons[2].name}
                                age={this.state.persons[2].age} />
    
                        </div>
                );
            }
    
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
            <p>This is really working!</p>
                <button
                    style={style}
                    onClick={this.togglePersonsHandler}>Switch Name</button>
                { persons}
              
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

     3.56 Outputting lists (turn into jsx object)

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    
    class App extends Component {
      state = {
        persons: [
          { name: 'Max', age: 28 },
          { name: 'Manu', age: 29 },
          { name: 'Stephanie', age: 26 }
        ],
          otherState: 'some other value',
          showPersons: false
    
      }
    
      switchNameHandler = (newName) => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState( {
          persons: [
            { name: newName, age: 28 },
            { name: 'Manu', age: 29 },
            { name: 'Stephanie', age: 27 }
          ]
        } )
      }
    
      nameChangedHandler = (event) => {
        this.setState( {
          persons: [
            { name: 'Max', age: 28 },
            { name: event.target.value, age: 29 },
            { name: 'Stephanie', age: 26 }
          ]
        } )
      }
    
        togglePersonsHandler = () => {
    
            const doesShow = this.state.showPersons;
            this.setState({showPersons: !doesShow});
    
        }
    
        render() {
            const style = {
                backgroundColor: 'white',
                font: 'inherit',
                border: '1px solid blue',
                padding: '8px',
                cursor:'pointer'
    
    
            };
    
            let persons = null;
            if(this.state.showPersons){
                persons = (
                    <div>
    
                        {this.state.persons.map(person => {
                            return <Person
                                name={person.name}
                                age={person.age} />//jsx object
                        })}
                        </div>
                );
            }
    
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
            <p>This is really working!</p>
                <button
                    style={style}
                    onClick={this.togglePersonsHandler}>Switch Name</button>
                {persons}
              
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

     delete list

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    
    class App extends Component {
      state = {
        persons: [
          { name: 'Max', age: 28 },
          { name: 'Manu', age: 29 },
          { name: 'Stephanie', age: 26 }
        ],
          otherState: 'some other value',
          showPersons: false
    
      }
    
      switchNameHandler = (newName) => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState( {
          persons: [
            { name: newName, age: 28 },
            { name: 'Manu', age: 29 },
            { name: 'Stephanie', age: 27 }
          ]
        } )
      }
    
      nameChangedHandler = (event) => {
        this.setState( {
          persons: [
            { name: 'Max', age: 28 },
            { name: event.target.value, age: 29 },
            { name: 'Stephanie', age: 26 }
          ]
        } )
      }
    
        togglePersonsHandler = () => {
    
            const doesShow = this.state.showPersons;
            this.setState({showPersons: !doesShow});
    
        }
    
        deletePersonHandler = (personIndex) => {
            const persons = this.state.persons;
            persons.splice(personIndex, 1);//删除数组中的元素,在index的地方删除一个元素
            this.setState({ persons: persons });
    
        }
    
        render() {
            const style = {
                backgroundColor: 'white',
                font: 'inherit',
                border: '1px solid blue',
                padding: '8px',
                cursor:'pointer'
    
    
            };
    
            let persons = null;
            if(this.state.showPersons){
                persons = (
                    <div>
    
                        {this.state.persons.map((person,index) => {
                            return <Person
                                click={() => this.deletePersonHandler(index)}//function带参数 必须那么写
                                name={person.name}
                                age={person.age} />//jsx object
                        })}
                        </div>
                );
            }
    
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
            <p>This is really working!</p>
                <button
                    style={style}
                    onClick={this.togglePersonsHandler}>Switch Name</button>
                {persons}
              
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

     map(a,b) a是元素,b是索引

     会报warning,改进:

        deletePersonHandler = (personIndex) => {
            const persons = this.state.persons;
            persons.splice(personIndex, 1);//删除数组中的元素,在index的地方删除一个元素
            this.setState({ persons: persons });

    因为object 和array 是 reference type

    persons有着上面persons的索引

    然后下面修改的是索引。

    好的步骤是先复制一个 然后再修改 而不是直接修改索引

     const persons = this.state.persons.slice(); slice()复制array 然后赋给persons

     3.60 Flexible List

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    
    class App extends Component {
      state = {
        persons: [
          {id:'1', name: 'Max', age: 28 },
          {id:'2', name: 'Manu', age: 29 },
          {id:'3', name: 'Stephanie', age: 26 }
        ],
          otherState: 'some other value',
          showPersons: false
    
      }
    
      switchNameHandler = (newName) => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState( {
          persons: [
            {name: newName, age: 28 },
            {name: 'Manu', age: 29 },
            {name: 'Stephanie', age: 27 }
          ]
        } )
      }
    
        nameChangedHandler = (event, id) => {
            const personIndex = this.state.persons.findIndex(p => {
                return p.id === id;//这个看不懂
    
    
            });
    
            const person = { ...this.state.persons[personIndex] };
    
            person.name = event.target.value;
    
            const persons = [...this.state.persons];
            persons[personIndex] = person;
    
            this.setState({
                persons: persons
            });
      }
    
        togglePersonsHandler = () => {
    
            const doesShow = this.state.showPersons;
            this.setState({showPersons: !doesShow});
    
        }
    
        deletePersonHandler = (personIndex) => {
            const persons = this.state.persons.slice();
            //const persons = [...this.state.persons];
            persons.splice(personIndex, 1);
            this.setState({ persons: persons });///bhb
    
        }
    
        render() {
            const style = {
                backgroundColor: 'white',
                font: 'inherit',
                border: '1px solid blue',
                padding: '8px',
                cursor:'pointer'
    
    
            };
    
            let persons = null;
            if(this.state.showPersons){
                persons = (
                    <div>
    
                        {this.state.persons.map((person,index) => {
                            return <Person
                                click={() => this.deletePersonHandler(index)}
                                name={person.name}
                                age={person.age}
                                key={person.id}//key 是保留字吗
                                changed={(event)=>this.nameChangedHandler(event,person.id)}
                            />//jsx object???
                        })}
                        </div>
                );
            }
    
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
            <p>This is really working!</p>
                <button
                    style={style}
                    onClick={this.togglePersonsHandler}>Switch Name</button>
                {persons}
              
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

     5.67 Styling Class Dynamic

            //let classes = [ 'red','bold'].join(' ');
            let classes = [];
            if (this.state.persons.length <= 2) {
                classes.push('red');//push red 给这个array
            }
            if (this.state.persons.length <= 1) {
                classes.push('bold');
            }
    
    
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
                <p className={classes.join(' ')}>This is really working!</p>
                <button
                    style={style}
                    onClick={this.togglePersonsHandler}>Switch Name</button>
                {persons}
              
          </div>
        );

     5.70 Styled Components

    import React from 'react';
    /*import './Person.css';*/
    /*import Radium from 'radium';*/
    import styled from 'styled-components';
    
    
    const StyledDiv = styled.div`
    
    
        60%;
        margin:16px;
        border:1px solid #eee;
        box-shadow: 0 2px 3px #ccc;
        padding: 16px;
        text-align: center;
    
    
    
    
    `;// 这已经是一个三方库形成的react component了 所以不需要用function括住它
    
    const person = ( props ) => {
        return (
            /*<div className="Person">*/
                <StyledDiv>
                <p onClick={props.click}>I'm {props.name} and I am {props.age} years old!</p>
                <p>{props.children}</p>
                <input type="text" onChange={props.changed} value={props.name} />
            </StyledDiv>
        )
    };
    
    export default person;

    同时要改动代码成为css,因为不再用jsx进行渲染

    import React, { Component } from 'react';
    import './App.css';
    import Person from './Person/Person';
    import styled from 'styled-components';
    
    
    
    
    const StyledButton = styled.button`
    
                background-color: ${props => props.alt ? 'red' : 'green'};
                color: white;
                font: inherit;
                border: 1px solid blue;
                padding: 8px;
                cursor: pointer;
                &:hover {
                    background-color: ${props => props.alt?'blue':'salmon'};
                    color: black;
                }
    
            `;
    
    class App extends Component {
      state = {
        persons: [
          {id:'1', name: 'Max', age: 28 },
          {id:'2', name: 'Manu', age: 29 },
          {id:'3', name: 'Stephanie', age: 26 }
        ],
          otherState: 'some other value',
          showPersons: false
    
      }
    
      switchNameHandler = (newName) => {
        // console.log('Was clicked!');
        // DON'T DO THIS: this.state.persons[0].name = 'Maximilian';
        this.setState( {
          persons: [
            {name: newName, age: 28 },
            {name: 'Manu', age: 29 },
            {name: 'Stephanie', age: 27 }
          ]
        } )
      }
    
        nameChangedHandler = (event, id) => {
            const personIndex = this.state.persons.findIndex(p => {
                return p.id === id;//这个看不懂
    
    
            });
    
            const person = { ...this.state.persons[personIndex] };
    
            person.name = event.target.value;
    
            const persons = [...this.state.persons];
            persons[personIndex] = person;
    
            this.setState({
                persons: persons
            });
      }
    
        togglePersonsHandler = () => {
    
            const doesShow = this.state.showPersons;
            this.setState({showPersons: !doesShow});
    
        }
    
        deletePersonHandler = (personIndex) => {
            const persons = this.state.persons.slice();
            //const persons = [...this.state.persons];
            persons.splice(personIndex, 1);
            this.setState({ persons: persons });///bhb
    
        }
    
        render() {
            
    
            let persons = null;
            if(this.state.showPersons){
                persons = (
                    <div>
    
                        {this.state.persons.map((person,index) => {
                            return <Person
                                click={() => this.deletePersonHandler(index)}
                                name={person.name}
                                age={person.age}
                                key={person.id}//key 是保留字吗
                                changed={(event)=>this.nameChangedHandler(event,person.id)}
                            />//jsx object???
                        })}
                        </div>
                );
    
                /*style.backgroundColor = 'red';*/
               /* style[':hover']= {
                    backgroundColor: 'salmon',
                        color: 'black'
                }*/
    
            }
    
    
            //let classes = [ 'red','bold'].join(' ');
            let classes = [];
            if (this.state.persons.length <= 2) {
                classes.push('red');//push red 给这个array
            }
            if (this.state.persons.length <= 1) {
                classes.push('bold');
            }
    
    
        return (
          <div className="App">
            <h1>Hi, I'm a React App</h1>
                <p className={classes.join(' ')}>This is really working!</p>
                <StyledButton alt={this.state.showPersons}
                    onClick={this.togglePersonsHandler}>Switch Name</StyledButton>
                {persons}
              
          </div>
        );
        // return React.createElement('div', {className: 'App'}, React.createElement('h1', null, 'Does this work now?'));
      }
    }
    
    export default App;

     6.81 Debugging

    import React, { Component } from 'react';
    
    
    
    
    class ErrorBoundary extends Component {
    
        state = {
            hasError: false,
            errorMessage:''
    
    
    
        }
    
        componentDidCatch = (error, info) => {
    
            this.setState({ hasError: true, errorMessage: error });
        }
    
    
        render() {
    
            if (this.state.hasError) {
    
                return <h1>{this.state.errorMessage}</h1>;
            } else {
    
                return this.props.children;//这是执行它的子类吗
    
            }
    
            
    
        }
    
    }
    
    export default ErrorBoundary;
    {this.state.persons.map((person,index) => {
                            return <ErrorBoundary key={person.id}><Person
                                click={() => this.deletePersonHandler(index)}
                                name={person.name}
                                age={person.age}
                                //key 是保留字吗
                                changed={(event)=>this.nameChangedHandler(event,person.id)}
                            /></ErrorBoundary>//jsx object???
                        })}

  • 相关阅读:
    url传参数出现乱码解决方法
    ASP.NET 当GridView中没有数据的时候,显示标题栏 并且给出一行数据提
    纯手工打造 IFAN (光盘回收及午餐筷子回收事业)
    javascript 收集
    Winform 中的控件透明设置要点
    对指定的网页进行截图 C#版
    生成短GUID的两个方法
    按键相关的 JS脚本代码
    ISCSI Enterprise Target 的其他资源和地址
    ORA01403:no data found 解决方法两则
  • 原文地址:https://www.cnblogs.com/cschen588/p/12384287.html
Copyright © 2020-2023  润新知