08-React扩展

news2024/11/16 21:45:25

08-React扩展


1. setState的2种写法

案例:

export default class Demo extends Component {
  state = {
    count: 0
  }
  add = () => {
    // 获取当前的值
    const { count } = this.state
    // 更新状态
    this.setState({ count: count + 1 })
    console.log(count);
  }
  render() {
    const { count } = this.state
    return (
      <div>
        <h2>当前求和为:{count}</h2>
        <button onClick={this.add}>点击+1</button>
      </div>
    )
  }
}

可以看到setState更新视图是一个异步的动作,同步的输出事件只能获取更新前的状态。可知setState()是立即执行同步的,但是它引起的后续动作(react模版更新)是异步的,要等后续的进程执行完再更新视图。

setStata函数可以传入两个参数,除了需要更新的state状态对象,还可以传入一个回调函数,这个回调函数是一个异步函数

export default class Demo extends Component {
  state = {
    count: 0
  }
  add = () => {
    // 获取当前的值
    const { count } = this.state
    // 更新状态
    this.setState({ count: count + 1 },() => {
      console.log(this.state.count)
    })
  }
  render() {
    const { count } = this.state
    return (
      <div>
        <h2>当前求和为:{count}</h2>
        <button onClick={this.add}>点击+1</button>
      </div>
    )
  }
}

1).对象式的setState

setState(stateChange, [callback])
  1. stateChange为状态改变对象(该对象可以体现出状态的更改)

    this.setState({ count: count + 1 },() => {})
    
  2. callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用

    this.setState({ count: count + 1 },() => {
        console.log(this.state.count)
    })
    

2).函数式的setState

 setState(updater, [callback])
  1. updater为返回stateChange对象的函数。

    this.setState(() => {
        return {count: this.state.count + 1}
    },() => {})
    
  2. updater可以接收到stateprops

    this.setState((state,props) => {
        console.log(state,props);
        return {count: state.count + 1}
    },() => {})
    

  3. callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。

    this.setState((state,props) => {
        return {count: state.count + 1}
    },() => {
        console.log(state.count)
    })
    

3).总结

  1. 对象式的setState是函数式的setState的简写方式(语法糖)

  2. 使用原则:

    1. 如果新状态不依赖于原状态 ===> 使用对象方式

      this.setState({count:99})
      
    2. 如果新状态依赖于原状态 ===> 使用函数方式

      this.setState(state => ({ count: state.count + 1 }))
      
    3. 如果需要在setState()执行后获取最新的状态数据,要在第二个callback函数中读取


2. 路由组件的lazyLoad

在实际开发中,整个React应用会有许多的组件,一般情况下在运行React项目时,程序会将所有组件全部加载,这样还未用到的组件也被加载,这样会影响程序整体运行的速度

实验:

export default class Demo extends Component {
  render() {
    return (
      <div>
        <div className="row">
          <div className="col-xs-offset-2 col-xs-8">
            <div className="pae-header"><h2>路由项目</h2></div>
          </div>
        </div>
        <div className="row">
          <div className="col-xs-2 col-xs-offset-2">
            <div className="list-group">
              <NavLink className="list-group-item" to="/about">About</NavLink>
              <NavLink className="list-group-item" to="/home">Home</NavLink>
            </div>
          </div>
          <div className="col-xs-6">
            <div className="panel">
              <div className="panel-body">
                <Route path="/about" component={About} />
                <Route path="/home" component={Home} />
              </div>
            </div>
          </div>
        </div>
      </div>
    )
  }
}

可以看出当点击每个组件的链接Tab时,程序并没有发送加载资源请求,说明一开始运行程序的时候,所有组件已经全部请求完毕了,为了减少资源的浪费和提升程序的性能,需要用到路由的懒加载。

1).lazy函数

通过React的lazy函数配合import()函数动态加载路由组件 ===> 路由组件代码会被分开打包

const Home=lazy(() => import('./Home'))
const About=lazy(() => import('./About'))

2).<Suspense>组件

通过<Suspense>组件包裹需要懒加载的组件,配置Lazy使用

export default class Demo extends Component {
  render() {
    return (
      <div>
        <div className="row">
          <div className="col-xs-offset-2 col-xs-8">
            <div className="pae-header"><h2>路由项目</h2></div>
          </div>
        </div>
        <div className="row">
          <div className="col-xs-2 col-xs-offset-2">
            <div className="list-group">
              <NavLink className="list-group-item" to="/about">About</NavLink>
              <NavLink className="list-group-item" to="/home">Home</NavLink>
            </div>
          </div>
          <div className="col-xs-6">
            <div className="panel">
              <div className="panel-body">
                <Suspense>
                <Route path="/about" component={About} />
                <Route path="/home" component={Home} />
                </Suspense>
              </div>
            </div>
          </div>
        </div>
      </div>
    )
  }
}

还可以通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面,当网速慢或者其他原因导致组件加载请求慢时会有一个备用组件作为优先显示

<Suspense fallback={<h1>Loading.....</h1>}>
    <Route path="/about" component={About} />
    <Route path="/home" component={Home} />
</Suspense>


3. Hooks

1). React Hook/Hooks是什么?

(1). Hook是React 16.8.0版本增加的新特性/新语法
(2). 可以让你在函数组件中使用 state 以及其他的 React 特性

2). 三个常用的Hook

a. State Hook
  1. State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作

    //类式组件
    class Demo extends Component {
        state = {
            count: 0
        }
        add = () => {
            this.setState(state => ({ count: state.count + 1 }))
        }
        render() {
            const { count } = this.state
            return (
                <div>
                    <h2>当前求和为:{count}</h2>
                    <button onClick={this.add}>点击+1</button>
                </div>
            )
        }
    }
    
  2. 语法:

     const [xxx, setXxx] = React.useState(initValue)  
    
  3. useState()说明:

  • 参数: 第一次初始化指定的值在内部作缓存
  • 返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
//函数式组件
function Demo() {
    const [count, setCount] = React.useState(0)
    function add() {
        setCount(count+1)
    }
    return (
        <div>
            <h2>当前求和为:{count}</h2>
            <button onClick={add}>点击+1</button>
        </div>
    )
}
  1. setXxx()的2种写法:
  • setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值

  • setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值

    function add() {
        // 第一种写法
        setCount(count+1)
        // 第二种写法
        setCount(count => count + 1)
      }
    
b. Effect Hook
  1. Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)

    // 类式组件写法
    class Demo extends Component {
        state = {
            count: 0
        }
        unmount = () => {
            createRoot(document.getElementById('root')).unmount();
        }
        componentDidMount() {
            this.timer = setInterval(() => {
                this.setState(state => ({ count: state.count + 1 }))
            }, 1000)
        }
        componentWillUnmount() {
            clearInterval(this.timer)
        }
        render() {
            const { count } = this.state
            return (
                <div>
                    <button onClick={this.unmount}>点击卸载</button>
                </div>
            )
        }
    } 
    

  2. React中的副作用操作:

    • ajax请求数据获取
    • 设置订阅 / 启动定时器
    • 手动更改真实DOM
  3. 语法和说明:

    useEffect(() => { 
        // 在此可以执行任何带副作用操作
        return () => {}
    }, [stateValue])
    
    //函数式组件
    function Demo() {
        const [count, setCount] = React.useState(0)
        React.useEffect(() => {
            let timer = setInterval(() => {
                setCount(count => count + 1)
            }, 1000)
            return () => {
                clearInterval(timer)
            }
        }, [])
        function unmount() {
            createRoot(document.getElementById('root')).unmount();
        }
        return (
            <div>
                <h2>当前求和为:{count}</h2>
                <button onClick={unmount}>点击卸载</button> 
            </div>
        )
    }
    

    分析:

    1. 使用React.useEffect()时不写第二个参数,那么Effect Hook会监测所有状态值的变化

      function Demo() {
          const [count, setCount] = React.useState(0)
          const [name, setName] = React.useState('Tom')
          React.useEffect(() => {
              console.log('@@');
          })
          function add() {
              setCount(count => count + 1)
          }
          function changeName() {
              setName('Jack')
          }
          return (
              <div>
                  <h2>当前求和为:{count}</h2>
                  <h2>当前的名字为{name}</h2> 
                  <button onClick={add}>点击+1</button>
                  <button onClick={changeName}>点我改名</button>
              </div>
          )
      }
      

    2. 使用React.useEffect()时写一个空数组为参数,那么Effect Hook不会监测任何状态值的变化,回调函数只会在第一次render()后执行

      React.useEffect(() => {
          console.log('@@');
      },[])
      

    3. 使用React.useEffect()时写值为指定状态值的非空数组作为第二个参数,那么Effect Hook只会监测指定状态值的变化

      React.useEffect(() => {
          console.log('@@');
      },[name])
      

    4. React.useEffect()中的返回函数return在组件卸载前执行,一般在此做一些收尾工作, 比如清除定时器/取消订阅等,

      注意点:每次执行这里的更新该函数也会去执行一遍

      React.useEffect(() => {
          let timer = setInterval(() => {
              setCount(count => count + 1)
          }, 1000)
          return () => {
              clearInterval(timer)
          } 
      },[])
      
  4. 可以把 useEffect Hook 看做如下三个函数的组合

    • componentDidMount()
    • componentDidUpdate()
    • componentWillUnmount()
c. Ref Hook
  1. Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据

    // 类式组件的写法
    class Demo extends Component {
      myRef=React.createRef();
      show=() => {
        alert(this.myRef.current.value)
      }
      render() {
        return (
          <div>
            <input ref={this.myRef} type="text" />
            <button onClick={this.show}>点击显示</button>
          </div>
        )
      }
    }
    

  2. 语法:

    const refContainer = useRef()
    
  3. 作用:保存标签对象,功能与React.createRef()一样

    // 函数式组件的写法
    function Demo() {
      const myRef=React.useRef()
      function show() {
        alert(myRef.current.value)
      }
      return (
        <div>
          <input ref={myRef} type="text" />
          <button onClick={show}>点击显示</button>
        </div>
      )
    }
    

4. Fragment

使用:
<Fragment><Fragment>
<></>
import React, { Component, Fragment } from 'react'
export default class Demo extends Component {
    render() {
        return (
            <Fragment>
                <input type="text" />
                <input type="text" />
            </Fragment> 
        )
    }
}
import React, { Component, Fragment } from 'react'
export default class Demo extends Component {
    render() {
        return (
            <>
            <input type="text" />
            <input type="text" />
            </>
        )
    }
}
作用

可以不用必须有一个真实的DOM根标签了

未使用Fragment标签:

使用Fragment标签:


5. Context

理解:

一种组件间通信方式, 常用于【祖组件】与【后代组件】间通信

使用:

需求:将A组件状态中的数据传递给C组件,不通过B组件的二次传递

export default class A extends Component {
    state = {
        username: 'tom',
        age: 18
    }
    render() {
        const { username, age } = this.state
        return (
            <div className='parent'>
                <h3>我是A组件</h3>
                <h4>我的用户名是:{username}</h4>
                <h4>我的年龄是:{age}</h4>
                <B/>
            </div>
        )
    }
}
class B extends Component {
    render() {
        return (
            <div className='child'>
                <h3>我是B组件</h3>
                <C/>
            </div>
        )
    }
}
class C extends Component {
    render() {
        return (
            <div className='grand'>
                <h3>我是C组件</h3>
                <h4>我从A组件拿到的用户名是:???</h4>
                <h4>我从A组件拿到的年龄时是:???</h4>
            </div>
        )
    }
}
  1. 创建Context容器对象:

    const XxxContext = React.createContext()  
    
    // 创建context对象
    const UserNameContext = React.createContext()
    
  2. 渲染子组时,外面包裹xxxContext.Provider, 通过value属性给后代组件传递数据:

    <xxxContext.Provider value={数据}>
    子组件
    </xxxContext.Provider>
    
    const { Provider } = UserNameContext
    export default class A extends Component {
        state = {
            username: 'tom',
            age: 18
        }
        render() { 
            const { username, age } = this.state
            return (
                <div className='parent'>
                    <h3>我是A组件</h3>
                    <h4>我的用户名是:{username}</h4>
                    <h4>我的年龄是:{age}</h4>
                    <Provider value={{ username, age }}>
                        <B />
                    </Provider>
                </div>
            )
        }
    }
    
  3. 后代组件读取数据:

    第一种方式:仅适用于类组件

      static contextType = xxxContext  // 声明接收context
      this.context // 读取context中的value数据
    
    class C extends Component {
        // 声明接收context
        static contextType = UserNameContext
        render() {
            console.log(this);
            console.log(this.context);
            const {username,age}=this.context
            return (
                <div className='grand'>
                    <h3>我是C组件</h3>
                    <h4>我从A组件拿到的用户名是:{username}</h4>
                    <h4>我从A组件拿到的年龄时是:{age}</h4>
                </div>
            )
        }
    }
    

    第二种方式: 函数组件与类组件都可以

     <xxxContext.Consumer>
        {
          value => ( // value就是context中的value数据
            //要显示的内容
          )
        }
      </xxxContext.Consumer>
    
    // 创建context对象
    const UserNameContext = React.createContext()
    const { Provider, Consumer } = UserNameContext
    function C() {
        return (
            <div className='grand'>
                <h3>我是C组件</h3>
                <Consumer>
                    {
                        value => {
                            return (
                                <div>
                                    <h4>我从A组件拿到的用户名是:{value.username}</h4>
                                    <h4>我从A组件拿到的年龄时是:{value.age}</h4>
                                </div>
                            )
                        }
                    }
                </Consumer>
            </div>
        )
    }
    

注意:

在应用开发中一般不用context, 一般都用它的封装react插件


6. 组件优化

Component的2个问题
  1. 只要执行setState(),即使不改变状态数据, 组件也会重新render() ==> 效率低

    export default class Parent extends Component {
        state = {
            carName: '奔驰'
        }
        changeName = () => {
            const { carName } = this.state
            this.setState({})
        }
        render() {
            console.log('parent---render');
            return (
                <div className='parent'>
                    <h3>我是Parent组件</h3>
                    <h4>我的车的名字是:{this.state.carName}</h4>
                    <button onClick={this.changeName}>点击换车</button>
                </div>
            )
        }
    }
    

  2. 只要当前组件重新render(), 就会自动重新render子组件,纵使子组件没有用到父组件的任何数据 ==> 效率低

export default class Parent extends Component {
    state = {
        carName: '奔驰',
        stus:['小王','小李','小芳']
    }
    changeName = () => {
        const { carName } = this.state
        this.setState({})
    }
    render() {
        console.log('parent---render');
        return (
            <div className='parent'>
                <h3>我是Parent组件</h3>
                <h4>我的车的名字是:{this.state.carName}</h4>
                <button onClick={this.changeName}>点击换车</button>
                <Child carName='奥拓'/>
            </div>
        )
    }
}

class Child extends Component {
    render() {
        console.log('child---render');
        return (
            <div className='child'>
                <h3>我是Child组件</h3>
                <h4>我接受到的车的名字是:{this.props.carName}</h4>
            </div>
        )
    }
}

效率高的做法

只有当组件的stateprops数据发生改变时才重新render()

原因

Component中的shouldComponentUpdate()总是返回true

解决
办法1:
  1. ​ 重写shouldComponentUpdate()方法

  2. ​ 比较新旧stateprops数据, 如果有变化才返回true, 如果没有返回false

    // person组件
    class Parent extends Component {
        state = {
            carName: '奔驰',
        }
        changeName = () => {
            const { carName } = this.state
            this.setState({})
        }
        shouldComponentUpdate(nextProps,nextState){
            return !this.state.carName===nextState.carName
        } 
        render() {
            console.log('parent---render');
            return (
                <div className='parent'>
                    <h3>我是Parent组件</h3>
                    <h4>我的车的名字是:{this.state.carName}</h4>
                    <button onClick={this.changeName}>点击换车</button>
                </div>
            )
        }
    }
    

    // Child组件
    class Child extends Component {
        shouldComponentUpdate(nextProps,nextState){
            return !this.props.carName===nextProps.carName
        }
        render() {
            console.log('child---render');
            return (
                <div className='child'>
                    <h3>我是Child组件</h3>
                    <h4>我接受到的车的名字是:{this.props.carName}</h4>
                </div>
            )
        }
    }
    

办法2:
  1. 使用PureComponent

    import React, { PureComponent} from 'react'
    
  2. PureComponent重写了shouldComponentUpdate(), 只有stateprops数据有变化才返回true

    export default class Parent extends PureComponent {
        state = {
            carName: '奔驰',
        }
        changeName = () => {
            const { carName } = this.state
            this.setState({})
        }
        render() {
            console.log('parent---render');
            return (
                <div className='parent'>
                    <h3>我是Parent组件</h3>
                    <h4>我的车的名字是:{this.state.carName}</h4>
                    <button onClick={this.changeName}>点击换车</button>
                    <Child carName='奥拓'/>
                </div>
            )
        }
    }
    
    class Child extends PureComponent {
        render() {
            console.log('child---render');
            return (
                <div className='child'>
                    <h3>我是Child组件</h3>
                    <h4>我接受到的车的名字是:{this.props.carName}</h4>
                </div>
            )
        }
    }
    

  3. 注意:

    1. 只是进行stateprops数据的浅比较, 如果只是数据对象内部数据变了, 返回false

    2. 不要直接修改state数据, 而是要产生新数据

      export default class Parent extends PureComponent {
          state = {
              carName: '奔驰'
          }
          changeName = () => {
              const obj = this.state
              obj.carName = '迈巴赫'
              console.log(obj === this.state);
              this.setState(obj)
          }
          render() {
              console.log('parent---render');
              return (
                  <div className='parent'>
                      <h3>我是Parent组件</h3>
                      <h4>我的车的名字是:{this.state.carName}</h4>
                      <button onClick={this.changeName}>点击换车</button>
                  </div>
              )
          }
      }
      

      PureComponent的底层做了一个浅对比,不会管Obj里面的属性是否发生变化,只要Objthis.state是同一个对象,就不会引起更新

      在之前更新数组类型的状态时说过不能通过使用pushunshift等原生数组的方法改写数组来更新状态,需要返回一个新的数组进行更新

      export default class Parent extends PureComponent {
          state = {
              stus:['小王','小李','小芳']
          }
          addStus=() => {
              const {stus}=this.state
              stus.unshift('小刘')
              this.setState({stus})
          }
          render() {
              console.log('parent---render');
              return (
                  <div className='parent'>
                      <h3>我是Parent组件</h3>
                      <h4>学生有{this.state.stus}</h4>
                      <button onClick={this.addStus}>添加学生</button>
                  </div>
              )
          }
      }
      

      需要通过[新增的数组元素,...原数组]的方式进行更新

      export default class Parent extends PureComponent {
          state = {
              stus:['小王','小李','小芳']
          }
          addStus=() => {
              const {stus}=this.state
              this.setState({stus:['小刘',...stus]})
          }
          render() {
              console.log('parent---render');
              return (
                  <div className='parent'>
                      <h3>我是Parent组件</h3>
                      <h4>学生有{this.state.stus}</h4>
                      <button onClick={this.addStus}>添加学生</button>
                  </div>
              )
          }
      }
      

  4. 项目中一般使用PureComponent来优化


7. render props

如何向组件内部动态传入带内容的结构(标签)?

Vue中:
使用slot技术, 也就是通过组件标签体传入结构 <A><B/></A>
React中:
使用children props: 通过组件标签体传入结构
使用render props: 通过组件标签属性传入结构,而且可以携带数据,一般用render函数属性

children props

之前说过标签体的内容是标签特殊的属性children,可以通过this.props.children进行读取,所以可以将B组件作为A组件的标签体写入

export default class Parent extends Component {
    render() {
        return (
            <div className='parent'>
                <h3>我是Parent组件</h3>
                <A> <B/> </A>
            </div>
        )
    }
}
class A extends Component {
    state={name:'tom'}
    render() {
        const {name}=this.state
        return (
            <div className='a'>
                <h3>我是A组件</h3>
                {this.props.children}
            </div>
        )
    }
}
class B extends Component {
    render() {
        return (
            <div className='b'>
                <h3>我是B组件</h3>
            </div>
        )
    }
}

问题: 如果B组件需要A组件内的数据 ==> 做不到

export default class Parent extends Component {
    render() {
        return (
            <div className='parent'>
                <h3>我是Parent组件</h3>
                <A> <B/> </A>
            </div>
        )
    }
}
class A extends Component {
    state={name:'tom'}
    render() {
        const {name}=this.state
        return (
            <div className='a'>
                <h3>我是A组件</h3>
                {this.props.children}
            </div>
        )
    }
}
class B extends Component {
    render() {
        return (
            <div className='b'>
                <h3>我是B组件</h3>
                <h3>从A获取到名字:{this.props.name}</h3>
            </div>
        )
    }
}

render props
<A render={(data) => <C data={data}></C>}></A>

A组件: {this.props.render(内部state数据)}
C组件: 读取A组件传入的数据显示 {this.props.data}

export default class Parent extends Component {
    render() {
        return (
            <div className='parent'>
                <h3>我是Parent组件</h3>
                <A render={(name)=><B name={name}/>}/>
            </div>
        )
    }
}
class A extends Component {
    state={name:'tom'}
    render() {
        const {name}=this.state
        return (
            <div className='a'>
                <h3>我是A组件</h3>
                {this.props.render(name)}
            </div>
        )
    }
}
class B extends Component {
    render() {
        return (
            <div className='b'>
                <h3>我是B组件</h3>
                <h3>从A获取到名字:{this.props.name}</h3>
            </div>
        )
    }
}


8. 错误边界

理解:

错误边界(Error boundary):用来捕获后代组件错误,渲染出备用页面

特点:

只能捕获后代组件生命周期产生的错误,不能捕获自己组件产生的错误和其他组件在合成事件、定时器中产生的错误

使用方式:

getDerivedStateFromError配合componentDidCatch

// 生命周期函数,一旦后台组件报错,就会触发
static getDerivedStateFromError(error) {
    console.log(error);
    // 在render之前触发
    // 返回新的state
    return {
        hasError: true,
    };
}
componentDidCatch(error, info) {
    // 统计页面的错误。发送请求发送到后台去
    console.log(error, info);
}
// Parent组件
export default class Parent extends Component {
  state={
    hasError:''//用于标识子组件是否产生错误
  }
  // 出错时的生命周期钩子  
  componentDidCatch(){
    console.log('渲染组件出错');
  }
  // 当Parent的子组件出现报错时候,会触发getDerivedStateFromError调用,并携带错误信息
  static getDerivedStateFromError(error){
    console.log(error);
    return {hasError:error}
  }
  render() {
    return (
      <div>
        <h2>我是Parent组件</h2>
        {this.state.hasError?<h2>网络出错</h2>:<Child/>}
        </div>
    )
  }
}
// Child组件
export default class Child extends Component {
    state={
         /* users:[
            {id:'1',name:'may',age:18},
            {id:'2',name:'tom',age:21},
            {id:'3',name:'jerry',age:19}
        ] */
        // 错误原因:
        users:''
    }
  render() {
    return (
      <div>
        <h2>
            我是Child组件
        </h2>
        <ul>
            {
                this.state.users.map((userObj)=>{
                    return <li key={userObj.id}>名字{userObj.name}——年龄{userObj.age}</li>
                })
            }
        </ul>
        </div>
    )
  }
}

9. 组件通信方式总结

组件间的关系:
  • 父子组件
  • 兄弟组件(非嵌套组件)
  • 祖孙组件(跨级组件)
几种通信方式:
  1. propschildren propsrender props
  2. ​ 消息订阅-发布:pubs-subevent等等
  3. ​ 集中式管理:reduxdva等等
  4. conText:生产者-消费者模式
比较好的搭配方式:
  1. ​ 父子组件:props
  2. ​ 兄弟组件:消息订阅-发布、集中式管理
  3. ​ 祖孙组件(跨级组件):消息订阅-发布、集中式管理、conText(开发用的少,封装插件用的多)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WSL2的安装与配置(创建Anaconda虚拟环境、更新软件包、安装PyTorch、VSCode)

1. WSL2 安装 以管理员身份打开 PowerShell&#xff08;“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”&#xff09;&#xff0c;然后输入以下命令&#xff1a; dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /a…

mfc140u.dll丢失的详细解决方法,最详细修复mfc140u.dll丢失的办法分享

在计算机技术日益发展的今天&#xff0c;我们不可避免地会遇到各种各样的技术问题。其中&#xff0c;“MFC140U.DLL丢失”是一个常见的错误&#xff0c;它可能会影响我们的电脑性能和软件运行。本文将详细介绍四种解决“MFC140U.DLL丢失”问题的方法。 首先&#xff0c;我们需…

详细解读DALLE 3技术报告:Improving Image Generation with Better Captions

Diffusion models代码解读&#xff1a;入门与实战 前言&#xff1a;OpenAI是推动大模型创新的领头羊&#xff0c;最近发布的DALLE 3凭借着远超市面上其他图片生成模型的表现&#xff0c;再次火出圈。最近OpenAI官方发布了DALLE 3的技术报告《Improving Image Generation with B…

Canvas和SvG的区别是什么?

Canvas和SVG是两种用于在Web上绘制图形的不同技术&#xff0c;它们有一些区别&#xff1a; 1&#xff1a;绘图方式&#xff1a; Canvas使用JavaScript API&#xff0c;通过在画布上绘制像素来创建图形。提供了对像素级别的控制&#xff0c;可以实现复杂的图形和动画效果。SVG…

项目经理之识别项目干系人

项目干系人管理是项目管理中的重要一环&#xff0c;识别和管理好项目干系人是成功实施项目的关键之一。本文将介绍4321项目干系人识别方法、干系人等级册以及五步判断法等工具&#xff0c;帮助项目经理更好地识别和管理项目干系人。同时&#xff0c;本文还将介绍干系人能量方格…

【疯狂Java讲义】Java学习记录(IO流)

IO流 IO&#xff1a;Input / Output 完成输入 / 输出 应用程序运行时——数据在内存中 ←→ 把数据写入硬盘&#xff08;磁带&#xff09; 内存中的数据不可持久保存 输入&#xff1a;从外部存储器&#xff08;硬盘、磁带、U盘&#…

在unity中利用公开变量引用物体和组件(有手就会)

在任意的脚本组件中&#xff08;必须先绑定物体&#xff09;&#xff0c;添加一个公开的 GameObject 类型的变量 using System.Collections; using System.Collections.Generic; using UnityEngine;public class test1 : MonoBehaviour {public GameObject other;// Start is …

蛋白质折叠

文章目录 4. GNNs for Protein foldingChemical Structures as GraphsProtein Structure PredictionMethods for Protein Structure PredictionOld method: fragment assemblyNew StrategyCo-evolution Analysis Towards An End-to-End Workflow AlphaFold2 architecture补充&a…

物联网AI MicroPython传感器学习 之 DRV8833电机驱动模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 DRV8833电机驱动模块是一种单H桥电机驱动芯片&#xff0c;可驱动2个直流电机和4线步进电机。内置过流保护&#xff0c;短路保护&#xff0c;欠压闭锁和过热保护&#xff0c;带低功耗睡眠模式。…

一篇文章讲懂mysql中的锁

事务的隔离性是由锁来实现的。 为什么需要锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题&#xff0c;当多个线程并发访问某个数据的时候&#xff0c;尤其是针对一些敏感的数据&#xff08;比如订单、金额等&#xff09;&#x…

高校教务系统登录页面JS分析——巢湖学院

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

UDP和TCP:奇妙的网络协议

之前&#xff0c;我们介绍了基本的网络原理和网络编程的相关知识&#xff0c;接下来会根据TCP/IP协议栈&#xff0c;具体的介绍这里的关键协议和知识。这部分知识虽然是理论为主&#xff0c;但是这是我们作为程序员的基本内功&#xff0c;非常重要。 本文我们重点介绍TCP和UDP…

TCP协议的报文结构及其特性

文章目录 一、TCP报头二、TCP的特性2.1确认应答2.2超时重传2.3连接管理2.3.1三次握手2.3.2四次挥手 2.4滑动窗口2.5流量控制2.6拥塞控制2.7延时应答2.8捎带应答2.9面向字节流2.10TCP异常情况的处理 一、TCP报头 TCP报头(header)分为11个部分&#xff0c;TCP报头大小为(20~60个…

springboot实现文件上传和读取

一.本地存储&#xff08;将图片存放在本地的nginx服务器上&#xff09; 在nginx上创建images目录&#xff0c;用来存储上传的文件 (使用nginx的好处是暴露端口&#xff0c;便于外界访问&#xff0c;同时nginx作为静态资源服务器在处理静态资源方面更快) 不然你访问文件就需要通…

android 13/14高版本SurfaceFlinger出现VSYNC-app/VSYNC-appSf/VSYNC-sf剖析

问题背景&#xff1a; 了解surfaceflinger的vsync同学都可能知道vsync属于一个节拍器&#xff0c;主要用来控制有节奏的渲染&#xff0c;不至于会产生什么画面撕裂等现象。 一般vsync都有会有2部分&#xff1a; app部分vsync&#xff0c;控制各个app可以有节奏的上帧 surfacef…

FPGA project : sdram

sdram读写控制器 实验目标&#xff1a; 设计并实现一个 SDRAM 数据读写控制器&#xff0c;使用 PC 机通过串口向 SDRAM 写入 10 字 节数据&#xff0c;并将写入的 10 字节数据读出&#xff0c;通过串口回传至 PC 机&#xff0c;在串口助手上位机上打印 显示回传数据。 框图设…

towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本

towxml的使用&#xff0c;在微信小程序中快速将markdown格式渲染为wxml文本 Towxml概述安装下载 Towxml在小程序中使用 towxml Towxml概述 towxml3.0 支持以下功能&#xff1a; ● echarts图表&#xff0c;默认禁用&#xff0c;需自行构建以开启此功能 ● LaTeX数学公式&#…

3D视觉硬件技术

目前市面上主流的3D光学视觉方案有三种&#xff1a; 双目立体视觉法&#xff08;Stereo Vision&#xff0c;在下文称双目法&#xff09;&#xff0c;结构光法&#xff08;Structured Light&#xff0c;在下文称结构光&#xff09;以及飞行时间法(Time of Flight, ToF在下文称T…

Java日志系统之Logback

目录 Logback Logback的简单使用 Logback配置文件 log4j.peoperties转化为logback.xml Logback Logback的性能要比log4j要好。 Logback分为三个模块&#xff1a; logback-core&#xff1a;其他两个模块的基础模块logback-classic&#xff1a;它是log4j的一个改良版本&am…

【网络协议】聊聊ICMP与ping是如何测试网络联通性

ICMP协议格式 ping是基于iCMP协议工作的&#xff0c;ICMP全称Internet Control Message Protocol&#xff0c;就是互联网控制报文协议。其实就是有点类似于古代行军打仗&#xff0c;哨探进行前方探明具体情况。 IMCP本身处于网络层&#xff0c;将报文封装在IP包里&#xff0c;…