关于闭包(完)笔记

 前言

bc4b92604274b173843d1841f705ae00.png

 大家好 我是歌谣 今天继续给大家带来关于闭包的讲解

 层级化代码

0704fcbc30e9d5932bce6b27eab8a877.png

const store={
    state:{
        a:1
    },
    mutation:{
        setA(state,num){
            state.a=num
        }
    }
}
store.setA(3)
store.setA=function(number){
    store.mutation.setA(store.state,number)
}

 案例ul-li

da08e10ce8476f596982f60f2166da61.png

<ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
var oListItems=document.querySelector("ul").querySelectorAll("li")
for(var i=0;i<oListItems.length;i++){
    oListItems[i].addEventListener("click",function(){
        console.log(i)
        console.log(oListItems[i].innerText)
    },false)
}

运行结果

a571f52f88ef09af1664884c18ee2b58.png

284f3cfa480e4efa17c629db2704d826.png

 立即执行函数

5513f83617679791dcbf13096b8127d1.png

var oListItems=document.querySelector("ul").querySelectorAll("li")
for(var i=0;i<oListItems.length;i++){
    (function(i){
        oListItems[i].addEventListener("click",function(){
            console.log(i)
            console.log(oListItems[i].innerText)
        },false)
    }(i))
}

运行结果

16c96f42b367eeb20116e472f000d7db.png

3cdbe96eca6cbe8006b654dfe329539d.png

 let解决

f040ea4984afaa947a0030c23cbcf4b4.png

var oListItems=document.querySelector("ul").querySelectorAll("li")
for(let i=0;i<oListItems.length;i++){
    // (function(i){
    //     oListItems[i].addEventListener("click",function(){
    //         console.log(i)
    //         console.log(oListItems[i].innerText)
    //     },false)
    // }(i))
    oListItems[i].addEventListener("click",function(){
        console.log(i)
        console.log(oListItems[i].innerText)
    },false)
}

 运行结果

5a358146d87fd977920f07e402050723.png

d1af5aa51fb74357c7663ac3be446f93.png

 构造函数案例

96a42d76c28893912d08d39ff7725d5e.png

function UserInfo(info){
    this.username=info.username
    this.age=info.age
    this.getInfo=(key)=>{
        return this[key]
    }
    this.setInfo=(key,value)=>{
        this[key]=value
    }
}
const {getInfo,setInfo}=new UserInfo({
    username:"geyao",
    age:"18"
})
console.log(getInfo,"getInfo is")




console.log(getInfo('username'))
console.log(getInfo('age'))

运行结果

136d81b223134cdb418408368d4f8f3a.png

8cf36724bf9261d03bc0a44bfddaef6c.png

 原型链写法

ac36d5a5410db381f967ffbeac9498a0.png

function UserInfo(info){
    this.username=info.username
    this.age=info.age
    // this.getInfo=(key)=>{
    //     return this[key]
    // }
    // this.setInfo=(key,value)=>{
    //     this[key]=value
    // }
}
UserInfo.prototype.getInfo=function(key){
    return this[key]
}
UserInfo.prototype.setInfo=function(key,value){
    this[key]=value
}
const userInfo=new UserInfo({
    username:"geyao",
    age:"18"
})
console.log(userInfo.getInfo('username'))
console.log(userInfo.getInfo('age'))
userInfo.setInfo('username',"fangfang")
userInfo.setInfo('age',19)
console.log(userInfo.getInfo('username'))
console.log(userInfo.getInfo('age'))

 运行结果

820e32aea40f8f4e42c82db1636c2405.png

deb29bd601284b4e19f5450928336056.png

 类组件写法

254701288ebb664b3eed03768972a43f.png

class UserInfo{
    constructor(info){
        this.username=info.username,
        this.age=info.age
    }
    getInfo=(key)=>{
        return this[key]
    }
    setInfo=(key,value)=>{
        this[key]=value
    }
}
const {getInfo,setInfo}=new UserInfo({
    username:"geyao",
    age:18
})
console.log(getInfo('username'))
console.log(getInfo('age'))
setInfo('username',"fangfang")
setInfo('age',19)
console.log(getInfo('username'))
console.log(getInfo('age'))

运行结果

e19b04e873e2b0c512210d2997c818dd.png

751b05f0335cff48e1d113bc5cdb4f2e.png

usestate实现单个

c95df116f9d112b393f765e5198e5c31.png

const root = ReactDOM.createRoot(document.querySelector('#app'));
root.render(<App />)
const MyReact = (() => {
    let _state;
    function useState(initialState) {
        _state = _state === undefined ? initialState : _state
        const _setState = function (newState) {
            if(typeof newState==='function'){
                _state=newState(_state)
            }else{
                _state = newState
            }
           
            render()
           
        }
        return [_state, _setState]
    }
    function render() {
        root.render(<App />)
    }
    return{
        useState
    }
})()




const { useState } = MyReact
function App() {
    const [title, setTitle] = useState("this is a title")
    const [content, setContent] = useState("this is a content")
    return (
        <div>
            <h1>{title}</h1>
            <button onClick={() => setTitle("这是标题")}>set title</button>
            <p>{content}</p>
            <button onClick={() => setContent("这是内容")}>set content</button>
        </div>
)
}

运行结果

c40d0620b0977787b4dc6cfe7560dd03.png

cf536f69b0c8824535ad558bce9c644c.png

usestate实现多个

d5e83a2427014fb411892c4a640b2930.png

const root = ReactDOM.createRoot(document.querySelector('#app'));
root.render(<App />)
const MyReact = (() => {
    const state=[]
    const stateSetters=[]




    let stateIndex=0
    function createState(initialState,index){
        return state[index]?state[index]:initialState
    }
    function createStateSetter(index){
        return function(newState){
            if(typeof newState==='function'){
                state[index]=newState(state[index])
            }else{
                state[index]=newState
            }
            render()
        }
    }
    function useState(initialState){
        state[stateIndex]=createState(initialState,stateIndex)
        if(!stateSetters[stateIndex]){
            stateSetters.push(createStateSetter(stateIndex))
        }
        const _state=state[stateIndex]
        const _setState=stateSetters[stateIndex]
        stateIndex++
        
        return [_state,_setState]
    }
    console.log(state,stateSetters)
    // function useState(initialState) {
    //     _state = _state === undefined ? initialState : _state
    //     const _setState = function (newState) {
    //         if(typeof newState==='function'){
    //             _state=newState(_state)
    //         }else{
    //             _state = newState
    //         }
           
    //         render()
           
    //     }
    //     return [_state, _setState]




    // }
    
    return{
        useState
    }
    function render() {
        stateIndex=0
        root.render(<App />)
    }




   
})()




const { useState } = MyReact




function App() {
    const [title, setTitle] = useState("this is a title")
    const [content, setContent] = useState("this is a content")
    return (
        <div>
            <h1>{title}</h1>
            <button onClick={() => setTitle("这是标题")}>set title</button>
            <p>{content}</p>
            <button onClick={() => setContent("这是内容")}>set content</button>
        </div>
)
}

 运行结果

494633903a50bd1fa17b977f033bb281.png

e08cacd6726ca46b67ffda9b26d20553.png

 总结

1702d9046aef6f9a02b5df1d9bee3361.png

  我是歌谣 最好的种树是十年前 其次是现在 想加入前端最强技术交流群私信我

下方查看历史文章

ebf7046d2055f771b2e9739d31cf7066.png

关于闭包(壹)

关于react-admin+postgrest小案例

关于react-redux案例

rc-tree的使用

cda2b2c8e0b7302356e87048af7300b3.gif

posted @ 2023-09-07 09:27  前端导师歌谣  阅读(10)  评论(0)    收藏  举报  来源