React学习

📑前言

本文主要是【React】——React基础的文章,如果有什么需要改进的地方还请大佬指出⛺️

🎬作者简介:大家好,我是听风与他🥇
☁️博客首页:CSDN主页听风与他
🌄每日一句:狠狠沉淀,顶峰相见

目录

    • 📑前言
  • React学习
    • 1.react特点
      • 1.1 ReactDOM
      • 1.2 jsx的基本语法
      • 1.3 js遍历数组
      • 1.4 组件的使用
      • 1.5 类式组件
    • 2.组件实例三大属性
      • 1.state
      • 2.pros
      • 3.refs
    • 3.react中收集表单数据
      • 1.非受控组件
      • 2.受控组件
    • 4.react的生命周期
      • 1.Demo
      • 2.DOM的diffing算法
      • 3.经典面试题
    • 📑文章末尾

React学习

1.react特点

  • 1.采用组件化的模式,声明式编程,提高开发效率及组件复用率
  • 2.使用虚拟DOM+优秀的Diffing算法,尽量减少与真实DOM的交互

1.1 ReactDOM

  • ReactDOM将组件或JSX元素渲染到DOM中。render(),负责在浏览器中渲染应用程序。
  • render方法只会覆盖,不会追加。

1.2 jsx的基本语法

  • 1.定义虚拟DOM,不能使用""

  • 2.标签中混入JS表达式时使用{}

    id = {myId.toUpperCase()}
    
  • 3.样式的类名指定不能使用class,使用className

  • 4.内敛样式要使用{{}}包裹

    style={{color:'skyblue',fontSize:'24px'}}
    

1.3 js遍历数组

objArr.map((item, index) => {return item.name})

1.4 组件的使用

当应用是以多组件的方式实现,这个应用技术一个组件化的应用

  • 1.组件名必须是首字母大写
  • 虚拟DOM元素只能有一个根元素
  • 3.虚拟DOM元素必须有结束标签</>

渲染类组件标签的基本流程

  • 1.React内部会创建组件实例对象
  • 调用render()得到虚拟DOM,并解析为真实DOM
  • 插入到指定的页面元素内部

1.5 类式组件

weather

class MyComponent extends React.Component {state = {isHot:false}render() {const {isHot} = this.statereturn <h1 onClick={this.changeWeather}>今天天气很{isHot?'炎热':'凉爽'}</h1>}changeWeather = ()=>{const isHot = this.state.isHotthis.setState({isHot:!isHot})}
}
ReactDOM.render(<MyComponent/>,document.querySelector('.test'))

this的指向真的需要好好学习

  1. 组件中的 render 方法中的 this 为组件实例对象
  2. 组件自定义方法中由于开启了严格模式,this 指向undefined如何解决
    1. 通过 bind 改变 this 指向
    2. 推荐采用箭头函数,箭头函数的 this 指向
  3. state 数据不能直接修改或者更新

2.组件实例三大属性

1.state

React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。

React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。

简单的说就是组件的状态,也就是该组件所存储的数据

类式组件中的使用

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><div id="zzl"></div><script type="text/babel">class Weather1 extends React.Component{constructor(props){super(props)}state = {weather:'炎热'}render(){return <h1>今天的天气很{this.state.weather}</h1>}}ReactDOM.render(<Weather1/>,document.getElementById('zzl'))</script>
</body>
</html>

2.pros

state不同,state是组件自身的状态,而props则是外部传入的数据

类式组件使用

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><div id="zz"></div><script type="text/babel">class Person extends React.Component{render(){return (<ul>{/* 接受数据并显示*/} <li>{this.props.name}</li><li>{this.props.age}</li><li>{this.props.sex}</li></ul>)}}ReactDOM.render(<Person name="zzl" age="19" sex="男" />,document.getElementById('zz'))</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><div id="zz"></div><script type="text/babel">class Person extends React.Component{render(){const {name,age,sex} = this.propsreturn (<ul>{/* 接受数据并显示*/} <li>{this.props.name}</li><li>{this.props.age}</li><li>{this.props.sex}</li></ul>)}}const p = {name:"zzl",age:"18",sex:'男'}ReactDOM.render(<Person {...p} />,document.getElementById('zz'))</script>
</body>
</html>

函数式组件中的使用

函数在使用props的时候,是作为参数进行使用的(props)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">const p = {name:"zzl",age:"18",sex:'男'}function Person(props){const {name,age,sex} = propsreturn (<ul><li>{name}</li><li>{age}</li><li>{sex}</li></ul>)}ReactDOM.render(<Person {...p} />,document.getElementById('zzl'))</script>
</body>
</html>

函数组件的 props定义:

  1. 在组件标签中传递 props的值
  2. 组件函数的参数为 props
  3. props的限制和默认值同样设置在原型对象上

3.refs

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。

在我们正常的操作节点时,需要采用DOM API 来查找元素,但是这样违背了 React 的理念,因此有了refs

字符串形式

在react,Vue中,均可以使用ref来操作DOM

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">class Demo1 extends React.Component{show1=()=> {const  {input1}=this.refsalert(input1.value)}show2 = () =>{const {input2}=this.refsalert(input2.value)}render(){return (<div><input ref="input1" type="text" placeholder="点击按钮提示数据"  /><button onClick={this.show1}>点击按键</button><input onBlur={this.show2} ref="input2" type="text" placeholder="失去焦点提示数据" /></div>)}}ReactDOM.render(<Demo1/>,document.getElementById('zzl'))</script>
</body>
</html>

createRef创建ref容器

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">class Demo1 extends React.Component{// React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是专人专用的myRef = React.createRef()show1=()=> {alert(this.myRef.current.value);}show2 = () =>{const {input2}=this.refsalert(input2.value)}render(){return (<div><input ref={this.myRef} type="text" placeholder="点击按钮提示数据"  /><button onClick={this.show1}>点击按键</button><input onBlur={this.show2} ref="input2" type="text" placeholder="失去焦点提示数据" /></div>)}}ReactDOM.render(<Demo1/>,document.getElementById('zzl'))</script>
</body>
</html>

ref回调形式

ref={c=> this.username = c}

3.react中收集表单数据

1.非受控组件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">//创建组件class Login extends React.Component{handleSubmit = (event) =>{event.preventDefault() //阻止表单提交const {username,password}=thisalert(`你输入的用户名是:${username.value},你输入的密码是:${password.value}`)}render(){return (//登录按钮被点击时,该事件会被触发<form  onSubmit={this.handleSubmit}>用户名:<input ref={c=> this.username = c} name="username" type="text"/>密码:<input ref={c=> this.password = c}  name="password" type="password"/><button>登录</button></form>)}}//渲染组件ReactDOM.render(<Login/>,document.getElementById('zzl'))</script>
</body>
</html>

2.受控组件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">class Login1 extends React.Component{handleSubmit = (event) =>{event.preventDefault()const {username,password} = this.statealert(`用户名为${username},密码为${password}`)}//初始化状态state = {username:'',password:''}//保持用户名saveUsername = (event)=>{this.setState({username:event.target.value})}savePassword = (event)=>{this.setState({password:event.target.value})}render(){return (<form onSubmit={this.handleSubmit}>用户名:<input onChange={this.saveUsername} type="text" name="username"  />密码:<input onChange={this.savePassword} type="password" name="password"/><button>登录</button></form>)}}ReactDOM.render(<Login1/>,document.getElementById('zzl'))</script>
</body>
</html>

4.react的生命周期

mount 挂载

unmount 卸载

记住,const声明的变量不能再改了

opacity可设置透明度,通过设置透明度可以实现由浅入深,由深入浅的效果。

组件挂载完毕

componentDidMount()

组件将要卸载

componentWillUnmount()

设置一个定时器

this.timer = setInterval(()=>{

},200);

卸载组件

ReactDOM.unmountComponentAtNode()

初始化渲染、状态更新之后

render()

1.Demo

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">class Life1 extends React.Component{state={opacity:1}death = () =>{ReactDOM.unmountComponentAtNode(document.getElementById('zzl'))}//挂载时componentDidMount(){ this.timer = setInterval(()=>{//获取原状态let {opacity} = this.stateopacity-=0.1if(opacity<=0) opacity=1this.setState({opacity})},200);}//组件将要卸载时componentWillUnmount(){clearInterval(this.timer)}render(){return (<div><h2 style={{opacity:this.state.opacity}}>学习react</h2><button onClick={this.death}>消失</button></div>)}}ReactDOM.render(<Life1/>,document.getElementById('zzl'))</script>
</body>
</html>

效果
在这里插入图片描述

初始化阶段总结

执行顺序 constructor -> getDerivedStateFromProps 或者 componentWillMount -> render -> componentDidMount

更新阶段

在这里插入图片描述

2.DOM的diffing算法

以按秒记时的时间为例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">class Time1 extends React.Component{state = {date:new Date()}componentDidMount(){setInterval(()=>{this.setState({date:new Date()})},1000)}render(){return (<div><input type="text"/><span>时间是{this.state.date.toTimeString()}</span></div>)}}ReactDOM.render(<Time1/>,document.getElementById('zzl'))</script>
</body>
</html>

3.经典面试题

  1. react/vue中的key有什么作用?(key的内部原理是什么?)

  2. 为什么遍历列表时,key最好不要用index?

    • 1.简单来说,key是虚拟DOM对象的标识,在更新显示时key起着极其重要的作用。

    • 在状态中的数据发生变化,react会根据新数据生成新的虚拟DOM,随后React进行新虚拟DOM旧虚拟DOM的diff比较

      比较规则:

      ​ a.旧虚拟DOM中找到了与新虚拟DOM相同的key:

      ​ 1.若虚拟DOM中内容没变,直接使用之前的真实DOM

      ​ 2.若虚拟DOM中内容变了,则生成新的真实DOM,随后替换掉页面中之前的真实DOM

      b.旧虚拟DOM中未找到与新虚拟DOM相同的key,则会根据数据创建新的真实DOM,随后渲染到页面

      1. 1.若对数据进行:逆序添加、逆序删除等破坏顺序操作。

        ​ 会产生没有必要的真实DOM更新 ==> 界面效果没问题,但效率低。

        2.如果结构中还包含输入类的DOM:

        ​ 会产生错误DOM更新 ==> 界面有问题。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>react</title>
</head>
<body><script type="text/javascript" src="/js/react.development.js"></script><script type="text/javascript" src="/js/react-dom.development.js"></script><script type="text/javascript" src="/js/babel.min.js"></script><script type="text/javascript" src="/js/prop-types.js"></script><div id="zzl"></div><script type="text/babel">/*慢动作回放----使用index索引值做为key初始数据:{id:1,name:'小张',age:18}{id:2,name:'小李',age:18}初始的虚拟DOM:<li key=0>小张---18</li><li key=1>小李---19</li>更新后的数据:{id:3,name:'小王',age:18}{id:1,name:'小张',age:18}{id:2,name:'小李',age:18}更新数据后的虚拟DOM:<li key=0>小王---20</li><li key=1>小张---20</li><li key=2>小李---20</li>
--------------------------------------------------------慢动作回放----使用id索引值做为key初始数据:{id:1,name:'小张',age:18}{id:2,name:'小李',age:18}初始的虚拟DOM:<li key=1>小张---18</li><li key=2>小李---19</li>更新后的数据:{id:3,name:'小王',age:18}{id:1,name:'小张',age:18}{id:2,name:'小张',age:18}更新数据后的虚拟DOM:<li key=3>小王---20</li><li key=1>小张---20</li><li key=2>小李---20</li>*/class Person extends React.Component{state = {persons:[{id:1,name:'小张',age:18},{id:2,name:'小李',age:19}]}add = () =>{const {persons} = this.stateconst p = {id:persons.length+1,name:'小王',age:20}this.setState({persons:[...persons,p]})}render(){return (<div><h2>展示人员信息</h2><button onClick={this.add}>添加一个小王</button><ul>{this.state.persons.map((personObj,index)=>{return <li key={index}>{personObj.name}---{personObj.age}</li>})}</ul><hr/><ul>{this.state.persons.map((personObj)=>{return <li key={personObj.id}>{personObj.name}---{personObj.age}</li>})}</ul></div>)}}ReactDOM.render(<Person/>,document.getElementById('zzl'))</script>
</body>
</html>

📑文章末尾

在这里插入图片描述

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

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

相关文章

C++ 哈希表OJ

目录 1、1. 两数之和 2、面试题 01.02. 判定是否互为字符重排 3、217. 存在重复元素 4、 219. 存在重复元素 II 5、49. 字母异位词分组 频繁查找某一个数的时候可以使用哈希表&#xff0c;哈希表可以使用容器&#xff0c;也可以使用数组模拟&#xff0c;当元素是字符串中的字…

算法打卡day9|栈与队列篇01|Leetcode 232.用栈实现队列、225. 用队列实现栈

栈与队列理论基础 栈&#xff08;Stack&#xff09; 栈是一种后进先出&#xff08;LIFO&#xff09;的数据结构,即最近添加到栈中的元素将是第一个被移除的元素。 栈通常有两个主要的操作&#xff1a;push 用于添加一个元素到栈顶&#xff0c;而 pop 用于移除栈顶的元素。此外…

二维码样式修改如何在线处理?在电脑上改二维码图案的方法

随着网络的不断发展&#xff0c;二维码的应用场景不断增多&#xff0c;很多人都会将内容放到二维码中&#xff0c;通过扫码的方式将储存在云端的数据调取显示。而面对不同的用途时&#xff0c;对二维码的样式也会有单独的要求&#xff0c;比如需要改变颜色、加入文字、logo、尺…

网络调试助手使用MQTT协议与Mosquitto通信(3)

一、连接报文 一开始设备需要连接到mqtt服务器&#xff0c;连接时的数据包内需要携带对应的设备ID&#xff0c;以及用户名和密码。这使用默认的用户名和密码。设备ID每一个设备都需要设置为不同的&#xff0c;两个相同的ID只能允许一台设备在线&#xff0c;另一个相同的ID的设备…

【C++庖丁解牛】模版初阶

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 泛型编程2. 函数模…

Dgraph 入门教程二《 快速开始》

1、Clound 云 云地址&#xff1a;Dgraph Cloud 登录Clound 云后&#xff0c;可以用云上的东西操作&#xff0c;可以用谷歌账号或者github账号登录。 启动云 &#xff08;1&#xff09;在云控制台&#xff0c;点击 Launch new backend. &#xff08;2&#xff09;选择计划&…

【PowerMockito:编写单元测试过程中原方法使用@Value注解注入的属性出现空指针】

错误场景 执行到Value的属性时会出现空指针&#xff0c;因为Value的属性为null 解决方法 在测试类调用被测试方法前&#xff0c;提前设置属性值&#xff0c;属性可以先自己定义好 ReflectionTestUtils.setField(endpointConnectionService, "exportUdpList", lis…

工业深度学习异常缺陷检测实战

在工业生产过程中&#xff0c;由于现有技术、工作条件等因素的不足和局限性&#xff0c;极易影响制成品的质量。其中&#xff0c;表面缺陷是产品质量受到影响的最直观表现&#xff0c;因此&#xff0c;为了保证合格率和可靠的质量&#xff0c;必须进行产品表面缺陷检测。 “缺陷…

制片管理工具:提高制片效率的必备工具

一、什么是制片管理工具 制片管理工具是一种为制片人提供支持和协助的软件或工具&#xff0c;并提供一种集中管理制作进度、任务分配、成本预算、资源管理和进度跟踪的方式。它可以帮助制片人在项目的开发、制作和发布方面更有效地进行规划和监督&#xff0c;确保整个流程能够…

LLM | Gemma的初体验

一起来体验一下吧~ 技术报告书&#xff1a;jgoogle/gemma-7b-it Hugging Facegemma-report.pdf (storage.googleapis.com) 代码1 &#xff1a;google-deepmind/gemma: Open weights LLM from Google DeepMind. (github.com) 代码2 &#xff1a;https://github.com/google/gem…

报名开启丨掘金海外,探寻泛娱乐社交APP出海新风口

随着国内泛娱乐行业用户规模趋于见顶&#xff0c;泛娱乐社交APP转向出海是必然趋势。 根据行业数据显示&#xff0c;有超过35%的国内实时社交企业已启动或者正在规划出海&#xff0c;而其中出海商户的音视频流量增长均超过了100&#xff05;。尤其是在东南亚、中东、拉美等新兴…

Maya笔记 软选择

文章目录 1什么是软选择2注意3如何打开软选择3.1方法一3.2方法二 4调整软选择的范围5衰减模式5.1体积模式5.2表面模式 6衰减曲线 1什么是软选择 也就是渐变选择&#xff0c;从中心点向外影响力度越来越小 软选择针对的是点线面这些模型元素 下图中展示了对被软选择的区域移动…

Rust入门:Rust如何调用C静态库的函数

关于Rust调用C&#xff0c;因为接口比较复杂&#xff0c;貌似Rust不打算支持。而对于C函数&#xff0c;则相对支持较好。 如果要研究C/Rust相互关系的话&#xff0c;可以参考&#xff1a; https://docs.rs/cxx/latest/cxx/ Rust ❤️ C 这里只对调用C静态库做一个最简短的介…

干货教程【软件篇】如何在Windows上安装Python环境以及设置国内源(Miniconda/Anaconda安装)

本文章涉及的所有安装包均在文章下方公众号中&#xff0c;回复python即可获取资源。 也可关注我们的官方网站&#xff1a; 考拉AI 小白安装前须了解一下 Python解释器是用来解释运行我们编写的Python代码。 Python标准库是Python自带的一系列标准模块&#xff0c;提供了各种…

浏览器修改接口返回数据展示在页面上

前端自己调试&#xff0c;想修改接口返回来的数据&#xff0c;然后展示在页面上 举例 接口返回了数据&#xff0c;想要修改此数据 这时就可以修改数据了&#xff0c;修改完成保存 然后刷新页面就会使用本地保存的数据了

Linux编程3.4 进程-进程标识

1、相关函数 #include<unistd.h> #include<sys/types.h> pid_t getpid(void); 获得当前进程ID uid_t getuid(void); 获得当前进程的实际用户ID uit_t geteuid(void); 获得当前进程的有效用户ID git_t getgid(void); 获得当前进程的用户组ID pit_t getppid(…

信号处理--基于单通道脑电信号EEG的睡眠分期评估

背景 睡眠对人体健康很重要。监测人体的睡眠分期对于人体健康和医疗具有重要意义。 亮点 架构在第一层使用两个具有不同滤波器大小的 CNN 和双向 LSTM。 CNN 可以被训练来学习滤波器&#xff0c;以从原始单通道 EEG 中提取时不变特征&#xff0c;而双向 LSTM 可以被训练来将…

数据库-DDL

show databases; 查询所有数据库 select database(); 查询当前数据库 use 数据库名&#xff1b; 使用数据库 creat database[if not exists] 数据库名…

vue2中如何实现添加一个空标签的效果,</>

前言&#xff1a; 众所周知&#xff0c;vue3突破了每一个vue文件中只能有一个根标签的限制&#xff0c;但是我们还有很多项目都是vue2的项目&#xff0c;如果让vue2中实现一个类似</>的效果呢&#xff0c;像react的16.2.0的版本之后&#xff0c;可以直接用<></&…

2024 年 AI 辅助研发趋势

随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI正逐渐渗透到研发的各个环节&#xff0c;变革着传统的研发模式。在这一背景下&#xff0c;AI辅助研发不仅…