Day59 (React)

1.接续昨天

(1)绑onclick事件给按钮,并执行handleClick

    handleClick(){  
        alert("OK");
    }

    <button onClick={this.handleClick} className="btn btn-outline-success">handleClick的function</button><hr /> 

(2)抓this => 才找的到this

    handleClick = () => {  
        alert("OK" + this);
        console.log(this);
    }

(3)资料改完,画面同时显示

    handleClick = () => {  

        // 方法1.
        // this.state.count += 1;  //+1
        // this.setState({}); //网页跑完後,变更内容同时变更显示

        // 方法2.
        // var newState = {...this.state}; //... = 旧的
        // newState.count+=1;
        // this.setState(newState);

        // 方法3.
        // this.setState({
        //     count : ++this.state.count //先+1 容易出错,少用
        // });

        // 方法4.
        this.setState({
        count : this.state.count +1  
        });

会发现只有个别元件再变化
https://ithelp.ithome.com.tw/upload/images/20210831/20137684Wx1WE9mh0U.jpg

(4)增加参数

方法1.

            //让 handleClick3 拿取资料
            handleClick2 = () => {  
              alert("OK" + this);
               console.log(this);
               this.setState({
                  count : this.state.count +1  
               });
            }

            //抓handleClick2并只让id:1改变
            handleClick3 = (id) => {  
                this.handleClick2({id:1});
                console.log(id);
            }


            <button
              // 让id:1传进来 console.log检查
              onClick={ () => {this.handleClick3(1)}}   
              className="btn btn-outline-success"
            >按我
            </button><hr />

            <button
              // 让id:2传进来 console.log检查
              onClick={ () => {this.handleClick3(2)}}   
              className="btn btn-outline-success"
            >按我按我
            </button><hr />

方法2.

            // 合并 (handleClick2 + handleClick3)
            handleClick4 = (myCount) => {  
              var newState = {...this.state}; //... = 旧的
              myCount++;
              newState.count = myCount;
              this.setState(newState);
              alert("handleClick4++")
            }

            <button
              onClick={ () => {this.handleClick4(this.state.count)}}   
              className="btn btn-outline-success"
            >按我按我按我
            </button><hr />

(5)让每个元件 可 个别被更改

(5-1)Lab_counters > counter-app > index.js

      import Counter from './components/counter.jsx'; //引用有物件的.js 需from
      import Counters from './components/counters.jsx'; //引用有物件的.js 需from

      ReactDOM.render(
        <React.StrictMode>
          <Counter />   
          <Counters />   //新增
          <button className="btn btn-outline-success">index.js内的</button>
        </React.StrictMode>,
        document.getElementById('root')
      );

(5-2)Lab_counters > counter-app > src > components > counters.jsx 新增物件

       import React, { Component } from 'react';  //引用react
       import Counter from './counter.jsx';   //引用counter.jsx
       
       class Counters extends Component {   //制作Counters
           state = {  }
           render() { 
               return ( 
                   <div>
                       <Counter />
                       <Counter />
                       <Counter />
                   </div>
                );
           }
       }
        
       export default Counters;

(5-3)http://localhost:3000/
每个元件分开互动,不受影响

(6)变更元件显示方式

Lab_counters > counter-app > src > components > counters.jsx

    class Counters extends Component {   //制作Counters
    state = { 
        counters:[
           {id:1,value:1},
           {id:2,value:2},
           {id:3,value:3},
           {id:4,value:4}
        ] 
    }

    render() { 
        return ( 
            <div>
                {/* state.counters 有4个用map方法,跑4次 */}
                {this.state.counters.map(c => <Counter key={c.id} />)} 
                {/* 跑1次 */}
                <Counter />
            </div>
         );
    }

(7)藉由子元素更改父元素

(7-1)Lab_counters > counter-app > src > components > counters.jsx

class Counters extends Component {   //制作Counters
    state = { 
        counters:[
           {id:1,value:1},
           {id:2,value:2},
           {id:3,value:3},
           {id:4,value:4}
        ] 
    }

    render() { 
        return ( 
            <div>
                {/* 此处value 更改counter.jsx内Counter元素value */}
                {this.state.counters.map(c => <Counter key={c.id} value={c.value} />)} 

(7-2)Lab_counters > counter-app > src > components > counter.jsx

    class Counter extends Component {
    state = {  
        count: this.props.value //由counters.jsx的counters元件[]更改value
    }

(8)利用[]制作value相加

(8-1)Lab_counters > counter-app > src > components > counters.jsx

    state = { 
        counters:[
           {id:1,value:1},
           {id:2,value:2},
           {id:3,value:3},
           {id:4,value:8},
           {id:5,value:8},
        ] 
    }

    // state.counters.value++
    getTotal(){
        var total = 0;
        for(let i = 0; i<this.state.counters.length;i++){
            total += this.state.counters[i].value;
        }
        return total
    }


    // 任何id++影响getTotal() ++
    doIncrement = (id) => {
        alert("ok");
   
        for(let i = 0; i < this.state.counters.length;i++){
            if(this.state.counters[i].id == id){
               this.state.counters[i].value +=1 ;
               break;
           }
        }
      this.setState({});
      console.log(id);
    }

    render() { 
        return ( 
            <div>
                {/* 1.state.counters 有4个用map方法,跑4次 */}
                {/* {this.state.counters.map(c => <Counter key={c.id} />)}  */}
                {/* 2.此处value 更改counter.jsx内Counter元素value */}
                {/* {this.state.counters.map(c => <Counter key={c.id} value={c.value} />)} */}
                {/* 跑1次 */}
                <Counter />

                {/* state.counters.value++ */}
                <h1>Total:{this.getTotal()}</h1><hr />

                {/* 新增onIncrement、id  由 counter.jsx的render接收*/}
                {this.state.counters.map(c => <Counter key={c.id} value={c.value} onIncrement={this.doIncrement} id={c.id}/>)}<hr />
            </div>
         );
    }
}

(8-2)Lab_counters > counter-app > src > components > counter.jsx

            {/* 此处接收counters.jsx 的 onIncrement={this.doIncrement} id={c.id} */}
            {/* 找到指定的编号,作用 */}
            {/* 前面按钮会无作用,因为没有抓到id */}
            <button
              onClick={ () => { this.props.onIncrement(this.props.id) }}   
              className="btn btn-outline-success"
            >我是Total会变化的按钮
            </button><hr />

(9)资料只想参考子阶时,把State改成props~(影片05 2:00)

+77笔记counter-6-所有资料全参考父阶.jsx


<<:  CLOUDWAYS虚拟主机限时首二月7折优惠码,只到2021/9/5

>>:  [教学] 如何架设狗狗币全节点 (更新 1.14.4 系统)

【红黑树十讲・参】红黑树新增・四大规则介绍・完整图解步骤

Youtube连结:https://bit.ly/3inN3zI 红黑树的新增观念,涵盖「旋转」与...

[Day27] 超萌❤ 教你用Python画天竺鼠车车逗女友开心!

当女朋友说想要你手作的礼物,但比起动手做,你更想写程序给女友工程师的浪漫, 这时候Python的Tu...

Day 14 实作 database migration

前言 昨天讲完了 manage.py 跟我们新加入的几个自订指令,今天我们还是离不开 manage....

[DAY 14] _最小系统板规划

我在第2天的时候说了如何做自己的开发板,今天来说最小系统板的规划吧,会做开发板後做最小系统板只需要好...

[Day 04] - 用Spring Boot连接Mongo DB

今天一开始 先来新增spring boot的连线设定 Spring Boot的设定档 applica...