react.16+

news2024/9/17 4:35:55

1、函数式组件

在vite脚手架中执行:

app.jsx:

import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'

function App() {
  console.log(this)
  return <h2>我是函数式组件</h2>
}

export default App

main.tsx:

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
)

注意:

        1、这里没有this,因为babel编译后开启了模式

        2、渲染的组件必须要大写开头(虚拟dom转为真实的dom)

2、类式组件

1、类式组件必须通过react的Component继承

2、组件必须在类中的render方法中返回

import { Component } from "react"
//使用类组件的时候必须要继承react中的Component
//类组件不写构造器,必须要render
//render放在组件的原型对象上
//this是指向组件实例对象,
class MyClassCom extends Component
{
    render()
    {
        return(
            <div>
                <h1>This is Class Component</h1>
            </div>
        )
    }
}
export {MyClassCom}

3、组件三大核心(都是在类组件中使用,props可以在函数组件中使用)

3.1、state

import { Component } from "react";
//使用类组件的时候必须要继承react中的Component
//类组件可以不写构造器,必须要render
//render放在组件的原型对象上
//this是指向组件实例对象,
class MyClassCom extends Component {
    //构造器调用一次
  constructor(props) {
    super(props);
    //初始化状态
    this.state = {
      name: "张三",
      isHot: false,
    };
    //绑定this,这里其实是重写的,可以用其他名字,但是下面调用也要改名字
   this.b = this.b.bind(this);
  }
  //调用1+n次,n次是响应式状态更新的次数
  render() {
    return (
      <div>
        <h1>今天{this.state.isHot ? "炎热" : "凉快"}</h1>
        <button onClick={this.a}>点击</button>
        <button onClick={this.b}>点击</button>
      </div>
    );
  }
  a = () => {
    //这里能拿到this,是因为箭头函数绑定了this
    console.log(this);
    //修改状态,必须通过setState修改状态
    this.setState({
      isHot: !this.state.isHot,
    });
  };
  b() {
    //因为是直接调用的类方法,不是实例对象调用的,所以拿不到this
    //类中的方法默认开启了局部严格模式,所以this指向undefined
    console.log(this);
    this.setState({
      isHot: !this.state.isHot,
    });
  }
}
export { MyClassCom };

简写方式:

import { Component } from "react";

class MyClassCom extends Component {
  //类中可以直接定义属性
  state = {
    name: "张三",
    isHot: false,
  };
  render() {
    return (
      <div>
        <h1>今天{this.state.isHot ? "炎热" : "凉快"}</h1>
        <button onClick={this.a}>点击</button>
      </div>
    );
  }
  //直接使用箭头函数(箭头函数可以修改this指向),避免了this指向修改,也就不用构造器了
  a = () => {
    this.setState({
      isHot: !this.state.isHot,
    });
  };
}
export { MyClassCom };

总结:

1、state是组件对象的重要属性,值是对象

2、组件被称为”状态机”,通过更新组件的state来更新对应页面显示(重新渲染页面-可以理解为响应式)

3、组件中的render方法中的this为组件实例对象

4、组件自定义方法中的this为undefined(通过强制绑定this,通过对象的build(),如果是类组件但是要使用构造器,也可以直接使用箭头函数(推荐直接使用箭头函数))

5、状态数据不能直接修改或者更新,要通过setState修改更新

3.2、props

3.2.1、基本使用

封装组件:

import { Component } from "react";
class Person extends Component<{ name: string,age:string,sex:string }> {
  render() {
    const {name, age , sex} = this.props;
    return (
        <ul>
            <li>{name}</li>
            <li>{age}</li>
            <li>{sex}</li>
        </ul>
    )
  }
}

export { Person }

调用组件(通过props传值)


import { Person } from './components/propsReact'

function App() {
  //return <h2>我是函数式组件<MyClassCom></MyClassCom></h2> 
  return (
    <div>
      <Person name="张三" age="18" sex="男"></Person>
      <Person name="李四" age="19" sex="女"></Person>
    </div>
  )
}

export default App

其实这里就是一个父传子的操作,跟vue思想差不多

3.2.2、props限制

类型限制:

import { Component } from "react";
import PropTypes from "prop-types";//需要安装库
class Person extends Component<{ name: string,age:string,sex:string }> {
  render() {
    const {name, age , sex} = this.props;
    return (
        <ul>
            <li>{name}</li>
            <li>{age}</li>
            <li>{sex}</li>
        </ul>
    )
  }
}

Person.propTypes = {
  name: PropTypes.string.isRequired,//isRequired是必填项
  age: PropTypes.string.isRequired,
  sex: PropTypes.string.isRequired,
};

export { Person }
import { Person } from './components/propsReact'

function App() {
  //return <h2>我是函数式组件<MyClassCom></MyClassCom></h2> 
  return (
    <div>
      <Person name="asd" age="18" sex="男"></Person>
      <Person name="李四" age="19" sex="女"></Person>
    </div>
  )
}

export default App

简写方式:

import { Component } from "react";
import PropTypes from "prop-types";
class Person extends Component<{ name: string; age: string; sex: string }> {
  static propTypes = {
    name: PropTypes.string.isRequired,
    age: PropTypes.string.isRequired,
    sex: PropTypes.string.isRequired,
  };
  static defaultProps = {
    name: "张三",
    age: "18",
    sex: "男",
  };
  render() {
    const { name, age, sex } = this.props;
    return (
      <ul>
        <li>{name}</li>
        <li>{age}</li>
        <li>{sex}</li>
      </ul>
    );
  }
}

export { Person };

3.2.3、函数组件使用props

函数式组件只能使用props,其他两个属性没法用

import { Component } from "react";
import PropTypes from "prop-types";
class Person extends Component<{ name: string; age: string; sex: string }> {
  static propTypes = {
    name: PropTypes.string.isRequired,
    age: PropTypes.string.isRequired,
    sex: PropTypes.string.isRequired,
  };
  static defaultProps = {
    name: "张三",
    age: "18",
    sex: "男",
  };
  render() {
    const { name, age, sex } = this.props;
    return (
      <ul>
        <li>{name}</li>
        <li>{age}</li>
        <li>{sex}</li>
      </ul>
    );
  }
}


function Person1(props: { name: string; age: string; sex: string }) {
    const { name, age, sex } = props;
    return (
      <ul>
        <li>{name}</li>
        <li>{age}</li>
        <li>{sex}</li>
      </ul>
    );
}
Person1.prototype = {
    name: PropTypes.string.isRequired,
    age: PropTypes.string.isRequired,
    sex: PropTypes.string.isRequired,
}
export { Person, Person1};


import { Person,Person1 } from './components/propsReact'

function App() {
  //return <h2>我是函数式组件<MyClassCom></MyClassCom></h2> 
  return (
    <div>
      <Person name="张三" age="18" sex="男"></Person>
      <Person name="李四" age="19" sex="女"></Person>
      <Person></Person>
      <Person1 name="张三" age="108" sex="男"></Person1>
    </div>
  )
}

export default App

总结:

1、每个组件都有props属性

2、组件所有的标签属性都会存在props中

3、组件内部不要修改props

4、通过标签属性从组件外部传递到内部的变化的数据

3.3、refs

3.3.1、字符串类型写法:

存在效率问题(不推荐使用)

import React from "react";
class RefsDemo extends React.Component{
    showData  = () => {
        console.log(this)
        const {input1} = this.refs
        alert(input1.value)
    }
    showData2 = () => {
        const {input2} = this.refs
        alert(input2.value)
    }
    render(): React.ReactNode {
        return (
            <div>
                <input ref="input1" type="text" />
                <button onClick={this.showData}></button>
                <input ref="input2" onBlur={this.showData2} type="text" />
            </div>
        )
    }
}

export default RefsDemo

3.3.2、回调函数形式

import React from "react";
class RefsDemo extends React.Component{
    showData  = () => {
        console.log(this)
        const {input1} = this
        alert(input1.value)
    }
    showData2 = () => {
        const {input2} = this
        alert(input2.value)
    }
    render(): React.ReactNode {
        return (
            <div>
                <input ref={c=>this.input1=c} type="text" />
                <button onClick={this.showData}></button>
                <input ref={c=>this.input2=c} onBlur={this.showData2} type="text" />
            </div>
        )
    }
}

export default RefsDemo

注意:

        1、这样写会有 副作用

        2、可以把方法抽出来放在render里面作为方法调用

3.3.3、React.createRef()钩子的使用

import React from "react";
class RefsDemo extends React.Component{
    /**每一个createRef都是单独的,用来获取组件中的元素 */
    myRef = React.createRef()
    myRef1 = React.createRef()
    showData = () => {
        console.log(this.myRef.current.value)
    }
    showData2 = () => {
        console.log(this.myRef1.current.value)
    }
    render(): React.ReactNode {
        return (
            <div>
                <input ref={this.myRef} type="text" />
                <button onClick={this.showData}></button>
                <input ref = {this.myRef1} onBlur={this.showData2}
                 type="text" />
            </div>
        )
    }
}

export default RefsDemo

总结ref:

        1、尽可能避免字符串方法的使用

        2、内联用的最多,第三个比较繁琐,要使用钩子

4、事件处理

4.1、非受控组件

import React from "react";
class Login extends React.Component {
    handleSubmit = (e) => {
        e.preventDefault()//阻止默认行为
        const { username, password } = this
        console.log(username, password)
        alert(`用户名:${username.value} 密码:${password.value}`)
    }
    render(): React.ReactNode {
        return (
            <div>
                <form action="https://www.baidu.com" onSubmit={this.handleSubmit}>
                    用户名:<input ref={c=>this.username = c} type="text" name="username" />
                    密码:<input ref = {c=>this.password = c} type="password" name="password" />
                    <button type="submit">登录</button>
                </form>
            </div>
        )
    }
}

export default Login;

4.2、受控组件

import React from "react";
class Login extends React.Component {
    state: Readonly<{}> = {
        username: "",
        password: ""
    }
    saveUsername = (e) =>{
        this.setState({
            username: e.target.value
        })
    }
    savePassword = (e) =>{
        this.setState({
            password: e.target.value
        })
    }
    handleSubmit = (e) => {
        e.preventDefault()//阻止默认行为
        const { username, password } = this.state
        console.log(username, password)
        alert(`用户名:${username} 密码:${password}`)
    }
    render(): React.ReactNode {
        return (
            <div>
                <form action="https://www.baidu.com" onSubmit={this.handleSubmit}>
                    用户名:<input onChange={this.saveUsername} type="text" name="username" />
                    密码:<input onChange={this.savePassword} type="password" name="password" />
                    <button type="submit">登录</button>
                </form>
            </div>
        )
    }
}

export default Login;

注意:

1、受控组件能够避免ref的使用

2、现用现取是非受控,维护状态的是受控组件

5、高阶函数+函数柯里化

高级函数:

        1、若A函数,按接的参数是一个函数,那么A就是高阶函数

        2、若A函数,调用的返回值依然是一个函数,那么A就可以称为高阶函数

  常见的高阶函数:Promise、setTimeout、arr.map()等

函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数

eg:

import React from "react";
class Login extends React.Component {
     saveFromData = (typename) =>{
        return (event) => {
            this.setState({
                [typename]: event.target.value
            })
        }
    }

    render(): React.ReactNode {
        return (
            <div>
                    用户名:<input onChange={this.saveFromData('username')} type="text" name="username" />
                    密码:<input onChange={this.saveFromData('password')} type="password" name="password" />
                    <button type="submit">登录</button>
            </div>
        )
    }
}

export default Login;

6、生命周期

组件挂载完毕和将要卸载的调用:

import React from "react";
class Login extends React.Component {
    // 组件挂载的时候调用
    componentDidMount(): void {
      this.timer =   setTimeout(() => {
           console.log(11111)
        }, 1000)
    }
    // 挂载的组件卸载前 的调用
    componentWillUnmount(): void {
        clearTimeout(this.timer)
    }

    render(): React.ReactNode {
        return (
            <div>
            </div>
        )
    }
}

export default Login;

 6.1、组件挂载流程

6.1.1、生命周期(旧)

eg:

import { Component } from "react";
class Count extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
    this.name = "count";
    console.log("count-constructor");
  }

  add = () => {
    this.setState({
      count: this.state.count + 1,
    });
  };
  foce = () => {
    this.forceUpdate();
  };
  //   组件将要挂载的钩子
  componentWillMount() {
    console.log("componentWillMount");
  }
  //   组件挂载完成的钩子
  componentDidMount() {
    console.log("componentDidMount");
  }

  // 组件将要卸载
  componentWillUnmount() {
    console.log("componentWillUnmount");
  }
  // 组件是否需要更新--阀门
  showldComponentUpdate() {
    console.log("showldComponentUpdate");
    return true;
  }
  // 组件将要更新
  componentWillUpdate() {
    console.log("componentWillUpdate");
  }
  // 组件更新完成
  componentDidUpdate() {
    console.log("componentDidUpdate");
  }

  render() {
    return (
      <div>
        <h2>当前求和为:{this.state.count}</h2>
        <button onClick={this.add}>点我+1</button>
        <button onClick={this.foce}>强制更新组件</button>
        <A name={this.name} content={this.state.count} />
      </div>
    );
  }
}
class A extends Component {
    //这个钩子比较奇特,只有操作更新的时候才会调用,第一次传的时候不调用,此处就是操作+1的时候才调用--将要废弃
  componentWillReceiveProps(props) {
      console.log("componentWillReceiveProps",props);
  }
  render() {
    return (
      <div>
        我是子组件{this.props.name}
        <p>{this.props.content}</p>
      </div>
    );
  }
}

export default Count;

总结:(标红的是常用的)

        1.初始化阶段:由ReactDoM.render()触发---初次渲染

                A、constructor()
                B、componentWillMount() //将要废弃
                C、render()
                D、componentDidMount() ---常用于做初始化数据(一般用于网络请求、订阅消息、开启定时器)

        2.更新阶段:由组件内部this.setsate()或父组件render触发

                A、shouldComponentUpdate()
                B、componentWillUpdate()  //将要废弃
                C、render()
                D、componentDidUpdate()

        3.卸线组件:由ReactD0M.unmountComponentAtNode()触发

                A、componentWillUnmount() --常用于收尾(关闭定时器、取消订阅等)

6.1.2、生命周期(新>=16.4)

 官网的周期图:

 eg:

import { Component, createRef } from "react";
class Count extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
    this.name = "count";
    console.log("count-constructor");
  }

  add = () => {
    this.setState({
      count: this.state.count + 1,
    });
  };
  foce = () => {
    this.forceUpdate();
  };
  //若state的值在任何时候取决于props的值,则使用getDerivedStateFromProps ---使用场景及其罕见
  // static getDerivedStateFromProps(props,state) {
  //   console.log("getDeruvedStateFromProps");
  //   // return console.log(props,state);
  // }
  
  //   组件挂载完成的钩子
  componentDidMount() {
    console.log("componentDidMount");
  }

  // 组件将要卸载
  componentWillUnmount() {
    console.log("componentWillUnmount");
  }
  // 组件是否需要更新--阀门
  showldComponentUpdate() {
    console.log("showldComponentUpdate");
    return true;
  }
  // 组件更新前获取快照
  getSnapshotBeforeUpdate() {
    console.log("getSnapshotBeforeUpdate");
    return null
  }
  // 组件更新完成
  componentDidUpdate(preProps, preState,Shouwkong) {
    console.log("componentDidUpdate",preProps,preState,Shouwkong);
  }

  render() {
    return (
      <div>
        <h2>当前求和为:{this.state.count}</h2>
        <button onClick={this.add}>点我+1</button>
        <DomList />
      </div>
    );
  }
}


export default Count;

/**
 * 列表滚动渲染案例
 */
class DomList extends Component {
  constructor(props) {
    super(props);
    this.listRef = createRef();
    this.state = {
      newsArr: [],
    };
  }

  componentDidMount() {
    setInterval(() => {
      const { newsArr } = this.state;
      const news = '商品' + (newsArr.length + 1);
      this.setState({
        newsArr: [news, ...newsArr],
      });
    }, 1000);
  }

  getSnapshotBeforeUpdate(prevProps, prevState) {
    return this.listRef.current ? this.listRef.current.scrollHeight : null;
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    if (this.listRef.current) {
      this.listRef.current.scrollTop += this.listRef.current.scrollHeight - snapshot;
    }
  }

  render() {
    return (
      <div className="list" ref={this.listRef} style={{ height: '300px', overflow: 'auto' }}>
        {this.state.newsArr.map((item, index) => (
          <p key={index} className="news">{item}</p>
        ))}
      </div>
    );
  }
}

总结:

(标红的是常用的)

        1.初始化阶段:由ReactDoM.render()触发---初次渲染

                A、constructor()
                B、getDerivedStateFromProps
                C、render()
                D、componentDidMount() ---常用于做初始化数据(一般用于网络请求、订阅消息、开启定时器)

        2.更新阶段:由组件内部this.setsate()或父组件render触发

                A、getDerivedStateFromProps
                B、showldComponentUpdate
                C、render()
                D、getSnapshotBeforeUpdate

                 E、componentDidUpdate

        3.卸线组件:由ReactD0M.unmountComponentAtNode()触发

                A、componentWillUnmount() --常用于收尾(关闭定时器、取消订阅等)

7、diffing算法

 

   

  8、脚手架配置

  8.1、代理配置

方法1:

        在package.json追加如下配置:

"proxy":"http://localhost:5000"

说明:

        1、优点:配置简单,前端请求资源时可以不加任何前缀

        2、缺点:不能配置多个代理

        3、工作方式:当请求3000不存在的时候,资源请求转发给5000

方法2:

1、第一步:创建代理配置文件

        在src下创建配置配置文件:src/setupProxy.js

2、编写setupProxy.js配置具体代理规则:

const proxy = require('http-proxy-middleware');
module.exports = function (app) {
  app.use(proxy('/api', { //api是需要转发的请求(所有带有/api标识的请求都会转发给后台-5000)
    target: 'http://localhost:3000' , //配置转发目标地址(能返回苏剧的服务器地址)
    changeOrigin: true,//控制服务器接收请求头中Host字段的值,
    /**
     * 重写请求路径
     * 例如:
     *  请求地址:http://localhost:3000/api/user/list
     *  重写之后:http://localhost:5000/user/list
     */
    pathRewrite: {
      '^/api': ''//去除请求地址中的/api,保证能正常请求到接口
    },  
    }
));
};

说明:

        1、优点:可以配置多个代理,可以灵活的控制请求是否走代理

        2、配置繁琐,前端请求资源时必须加前缀

9、消息订阅-发布机制

1、工具库:PubSubJS

2、npm install pubsub-js

3、使用: 

                3.1、improt PubSub from 'pubsub-js'

                3.2、PubSub.subscribe("del"mfunction(data){})//订阅

                3.3、PubSub.publish(‘del’,data)//发布消息

eg:

父组件:
import React, { Component } from 'react'
import A from "../components/A"
import B from "../components/B"
export default class test extends Component {
  render() {
    return (
      <div>
              <A/>
              <B/>
      </div>

    )
  }
}



A子组件--发布
import React, { Component } from 'react'
import pubsub from 'pubsub-js'
export default class A extends Component {
    componentDidMount(){
        pubsub.publish('test', 'test')
    }
  render() {
    return (
      <div>A</div>
    )
  }
}


B子组件--订阅
import React, { Component } from 'react'
import pubsub from 'pubsub-js'
export default class B extends Component {
    componentDidMount() {
        pubsub.subscribe('test',(msg,data)=>{
            console.log(msg,data)
        })
    }
    componentWillUnmount() {
        pubsub.unsubscribe('test')
    }
  render() {
    return (
      <div>B</div>
    )
  }
}



10、路由(参考另外一个18+的教程)

参考链接:Home v6.24.0 | React Router

对比:

 基本使用的三种方式:(16)

 

 11、编程式导航

方法调用:

通过onclick调用:

detail组件接收:

 12、withRouter的使用

 13、BrowserRouter与HashRouter区别

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

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

相关文章

如何通过注解注入一个自定义的FactoryBean

一、引入依赖二、定义一个注解三、创建一个FactoryBean四、创建一个BeanPostProcessor4.1 其他关联类AnnotationUtilsServiceBeanNameBuilder 五、注入InstantiationAwareBeanPostProcessor到IoC中5.1 实现ImportBeanDefinitionRegistrar接口5.2 通过Import注入 六、使用6.1 打…

【proteus经典项目实战】51单片机用计数器中断实现100以内的按键计数并播放音乐

一、简介 一个基于8051微控制器的计数器系统&#xff0c;该系统能够通过按键输入递增计数&#xff0c;并且能够在达到100时归零。该系统将使用计数器中断和外部中断来实现其功能。 51单片机因其简单易用和成本效益高&#xff0c;成为电子爱好者和学生的首选平台。通过编程单片…

猫头虎分享 || 最全Python的Scapy库基础知识点汇总

&#x1f431;‍&#x1f464; 猫头虎分享 || Python的Scapy库基础知识点汇总 摘要 Scapy 是一个强大的Python库&#xff0c;用于网络数据包的生成、解析和操作。通过Scapy&#xff0c;开发者可以轻松地创建自定义数据包&#xff0c;捕获网络流量&#xff0c;并执行网络扫描。…

算法日记day 22

一、二叉搜索树中的插入操作 题目&#xff1a; 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。…

Python学习笔记46:游戏篇之外星人入侵(七)

前言 到目前为止&#xff0c;我们已经完成了游戏窗口的创建&#xff0c;飞船的加载&#xff0c;飞船的移动&#xff0c;发射子弹等功能。很高兴的说一声&#xff0c;基础的游戏功能已经完成一半了&#xff0c;再过几天我们就可以尝试驾驶 飞船击毁外星人了。当然&#xff0c;计…

【优秀python web系统毕设】基于python的全国招聘数据分析可视化系统,包括随机森林算法

1.1 研究背景 自1997年互联网开始在国内的招聘行业发展至今已有二十几年的历史&#xff0c;互联网招聘进入了蓬勃发展的“黄金时代”。根据智研咨询发布的《2023年中国互联网招聘行业发展现状》报告显示&#xff0c;截至2023年5月&#xff0c;中国互联网招聘平台中&#xff0c…

数据结构(Java):反射枚举Lambda表达式

目录 1、反射 1.1 反射的定义 1.2 反射机制的原理 1.3 反射相关类 1.4 Class类 1.4.1 相关方法 1.4.1.1 常用获得类相关的方法 ​编辑 1.4.1.2 常用获得类中属性相关的方法 1.4.1.3 获得类中构造器相关的方法 1.4.1.4 获得类中方法相关的方法 1.4.2 获取Class对象 1.…

DeFi革命:揭秘去中心化金融的核心技术与实操指南

目录 DeFi&#xff08;去中心化金融&#xff09;综述 基本特点 第一&#xff0c;DeFi 是无许可的金融 第二&#xff0c;DeFi 是无门槛的金融 第三&#xff0c;DeFi 是无人驾驶的金融 典型商业模式 闪电贷 MakerDAO 面临的挑战 DeFi技术要点 椭圆曲线签名 EIP-712:…

IS-LM模型的公式与应用解析

IS-LM模型的公式与应用解析 IS-LM模型的核心作用 IS-LM模型是宏观经济学中的一个重要工具&#xff0c;用于分析财政政策和货币政策对经济的影响。IS曲线代表商品市场均衡&#xff0c;LM曲线代表货币市场均衡。两条曲线的交点表示商品市场和货币市场同时达到均衡时的利率和收入…

MySQL笔记3——高级数据查询语句DQL

多表联查 多表联查可以通过连接运算实现&#xff0c;即将多张表通过主外键关系关联在一起进行查询。下图提供了多表联查 时用到的数据库表之间的关系。 等值查询和非等值查询 非等值查询&#xff1a;SELECT * FROM 表1&#xff0c;表2 等值查询&#xff1a;SELECT * FROM 表…

DDR3布线时候的经验总结

摆放BGA下面的滤波电容的时候注意不要让两个电容的电源和地对着头放&#xff0c;手工焊接时候容易短路 阻抗层必须是实心铜皮覆盖&#xff1a; &#xff08;3&#xff09;阻抗线一定要有阻抗参考层&#xff0c;一般以相邻的接地或电源层做参考层&#xff08;如顶层阻抗线&…

人工智能技术的分析与探讨

《人工智能技术的分析与探讨》 摘要&#xff1a; 本文深入探讨了人工智能技术在多个领域的应用&#xff0c;包括智能感知、智能语音、智能问答、智能机器人、智能制造、智能医疗等。详细阐述了这些技术在当前的应用现状和主要场景&#xff0c;展示了一些典型的应用案例&#…

放大电路总结

补充: 只有直流移动时才有Rbe动态等效电阻 从RsUs看进去,实际上不管接了什么东西都能够看成是一个Ri(输入电阻) Ri Ui/Ii Rb//Rbe Ui/Us Ri/(RiRs) Aus (Uo/Ui)*(Ui/Us) Au *Ri/(RiRs) 当前面是一个电压源的信号 我们就需要输入电阻更大 Ro--->输出电阻--->将…

学习C语言第十四天(指针练习)

1.第一题C 2.第二题C 3.第三题 00345 short类型解引用一次访问两个字节 4.第四题 6&#xff0c;12 5.第五题C 6.第六题 下面代码结果是0x11223300 7.第七题 int main() {int a 0;int n 0;scanf("%d %d",&a,&n);int i 0;int k 0;int sum 0;for (i 0;…

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日&#xff0c;创维汽车滁州永通体验中心盛大开业&#xff0c;当日&#xff0c;创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典&#xff0c;共同见证创维汽车滁州永通体验中心成功落地。 2021年&#xff0c;新能源乘用车高速发展&#xff0c;…

安装CUDA Cudnn Pytorch(GPU版本)步骤

一.先看自己的电脑NVIDIA 支持CUDA版本是多少&#xff1f; 1.打开NVIDIA控制面板 2.点击帮助---系统信息--组件 我的支持CUDA11.6 二.再看支持Pytorch的CUDA版本 三.打开CUDA官网 下载CUDA 11.6 下载好后&#xff0c;安装 选择 自定义 然后安装位置 &#xff08;先去F盘…

MySQL可重复读的隔离机制下是否彻底解决了幻读?

答案&#xff1a;没有彻底解决。 一、什么是幻读&#xff1f; 当同一个查询在不同时间产生不同的结果集时&#xff0c;事务中就会出现幻读问题。 幻读关注的是记录数量的不同。 不可重复读关注的是记录内容的不同。 二、快照读和当前读 InnoDB引擎的默认隔离级别是可重复读&…

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上--port --8080 就可以将端口号修改为8080&#xff08;修改后边的数字就可以修改为你想要的端口号&#xff09;

pytorch-训练自定义数据集实战

目录 1. 步骤2. 加载数据2.1 继承Dataset2.1.1 生成name2label2.1.2 生成image path, label的文件2.1.3 __len__2.1.3 __getitem__2.1.4 数据切分为train、val、test 3. 建立模型4. 训练和测试4. 完整代码 1. 步骤 加载数据创建模型训练和测试迁移学习 2. 加载数据 这里以宝…

打造创新项目:从理念到市场的成功之路

打造创新项目&#xff1a;从理念到市场的成功之路 前言为何创新&#xff1f;如何创新&#xff1f;创新的意义 一、深入市场&#xff0c;洞察行业脉搏二、精准定位&#xff0c;锁定目标市场三、全面评估&#xff0c;确保项目可行性四、创新引领&#xff0c;打造独特卖点五、开放…