前端 react 面试题 (一)

文章目录

    • vue与react的区别。
    • react的生命周期有哪些及它们的作用。
    • setState是同步的还是异步的。
    • 如何更新数据后,立刻获取最新的dom或者更新后的数据。
      • 使用回调函数:
      • 在生命周期方法中处理:
    • 函数式组件和class组件的区别。
      • class组件
      • 函数式组件
      • 区别
    • 常用的hooks有哪些。
    • 自定义hooks。
      • 使用自定义 Hooks 时的注意点:
      • 创建自定义 Hooks 时的注意点:
    • 为什么同一个hooks调用很多次,其不同的结果都能被保存并返回来。
    • 手写一个useState的实现原理。
    • useEffect如何消除副作用。
    • react如何优化每次父组件数据更新,子组件也会更新。
      • 1. 使用 `React.memo`:
      • 2. 使用 `shouldComponentUpdate`:
      • 3. 将不变的函数移到外部:
      • 4. 使用 useCallback 和 useMemo:
      • 5. 使用 React Developer Tools 分析性能:
    • memo和useMemo的区别。
    • react虚拟dom。
      • 1. 创建虚拟 DOM:
      • 2. 对比虚拟 DOM:
      • 3. 计算差异:
      • 4. 更新真实 DOM:
      • 5. 提高性能:
      • 虚拟 DOM 的优势:

在这里插入图片描述

vue与react的区别。

Vue.js和React.js都是流行的JavaScript库,用于构建用户界面,但它们有一些关键的区别。以下是一些Vue.js和React.js之间的主要区别:

  1. 设计和理念:

    • Vue.js: 设计简单、灵活,更容易上手。Vue强调渐进式框架,可以逐步地应用到项目中。
    • React.js: 设计更加灵活且功能强大,但可能对初学者有一定的学习曲线。React注重构建可复用的组件。
  2. 模板语法和 JSX:

    • Vue.js: 使用基于HTML的模板语法,将模板直接写在HTML中。
    • React.js: 使用JSX(JavaScript XML),这是一种在JavaScript中嵌套XML标签的语法。JSX允许在JavaScript代码中直接编写类似XML的结构。
  3. 组件通信:

    • Vue.js: 支持父子组件通信、兄弟组件通信、以及通过事件总线或Vuex(状态管理库)进行跨组件通信。
    • React.js: 父子组件通信通过props,而跨组件通信通常需要通过提升状态(lifting state up)或使用全局状态管理库,如Redux。
  4. 状态管理:

    • Vue.js: 包含了Vuex,一个专门用于状态管理的库。Vuex提供了一种集中式管理状态的方式。
    • React.js: 可以使用Context API来进行状态管理,但更常见的是使用独立的状态管理库,如Redux。
  5. 生命周期:

    • Vue.js: 拥有明确的生命周期钩子,例如beforeCreatecreatedmounted等。
    • React.js: 也有生命周期方法,包括componentDidMountcomponentWillUnmount等。
  6. 指令和特性:

    • Vue.js: 提供了丰富的指令,如v-ifv-forv-bind等,用于操作DOM。
    • React.js: 使用属性(props)和状态(state)来管理组件的渲染和行为。
  7. 学习曲线:

    • Vue.js: 相对较低的学习曲线,尤其适合初学者。
    • React.js: 初始学习曲线可能较陡峭,但一旦掌握了基本概念,会变得更容易。
  8. 社区和生态系统:

    • Vue.js: 在中国社区有较大影响力,生态系统不如React庞大,但在一些场景中更受欢迎。
    • React.js: 拥有庞大的社区和生态系统,广泛应用于大型项目和企业级应用。

react的生命周期有哪些及它们的作用。

https://blog.csdn.net/glorydx/article/details/103358868 react生命周期介绍

setState是同步的还是异步的。

在 React 中,setState 方法通常是异步的。这是因为 React 会对多个 setState 调用进行批处理,以提高性能。React 将这些 setState 调用合并成一个单一的更新,然后异步地应用到组件状态。

这种异步的行为有一些重要的方面:

  1. 在事件处理函数中的异步行为:

    handleClick() {
      this.setState({ count: this.state.count + 1 });
      console.log(this.state.count); // 不一定会立即更新
    }
    

    上述代码中,console.log 不一定会在 setState 之后立即显示更新后的状态。React 在合适的时候异步地执行状态更新。

  2. setState 接受函数参数的情况:

    this.setState((prevState) => {
      return { count: prevState.count + 1 };
    });
    

    setState 接受一个函数作为参数时,React 会在合适的时候调用这个函数,提供最新的状态,以确保正确的更新。

  3. componentDidUpdate 中的异步行为:

    componentDidUpdate() {
      console.log(this.state.count); // 不一定会立即更新
    }
    

    componentDidUpdate 生命周期方法中,this.state 不一定会立即反映最新的状态,因为状态更新是异步的。

虽然 setState 是异步的,但React提供了一些能够在状态更新后执行的回调函数,可以通过将回调函数作为 setState 的第二个参数来实现:

this.setState({ count: this.state.count + 1 }, () => {
  console.log(this.state.count); // 在回调函数中可以访问到最新的状态
});

总体而言,理解 setState 的异步行为对于正确地处理 React 组件的状态和生命周期是很重要的。
更多关于setstate介绍

react 玩转state和setState

如何更新数据后,立刻获取最新的dom或者更新后的数据。

在 React 中,setState 是异步的,因此在调用 setState 后,不能立即获得更新后的状态或 DOM。如果你需要在 setState 完成并且组件已经重新渲染后执行一些操作,你可以使用回调函数或者在生命周期方法中处理。

使用回调函数:

this.setState({ count: this.state.count + 1 }, () => {
  // 在回调函数中可以访问到最新的状态
  console.log("Updated count:", this.state.count);

  // 这里可以执行其他需要在状态更新后立即执行的操作
});

在生命周期方法中处理:

如果你需要在组件更新后执行操作,可以在 componentDidUpdate 生命周期方法中处理:

componentDidUpdate(prevProps, prevState) {
  // 检查状态是否发生变化
  if (this.state.count !== prevState.count) {
    console.log("Updated count:", this.state.count);

    // 这里可以执行其他需要在状态更新后立即执行的操作
  }
}

componentDidUpdate 中,你可以比较当前状态和之前的状态,然后执行相应的操作。需要注意的是,在使用这种方法时,确保你不会陷入无限循环的状态,即在 componentDidUpdate 中再次调用 setState 导致组件再次更新。

选择使用回调函数还是生命周期方法取决于你的具体需求和场景。如果你需要访问最新的状态,回调函数是一个更直接的方式。如果你需要在组件更新后执行其他操作,componentDidUpdate 可能更适合。

函数式组件和class组件的区别。

class组件

class ClassComponentWithState extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }

  componentDidMount() {
    document.title = `Count: ${this.state.count}`;
  }

  componentDidUpdate(prevProps, prevState) {
    if (this.state.count !== prevState.count) {
      document.title = `Count: ${this.state.count}`;
    }
  }

  render() {
    return (
      <div>
        <p>{this.props.message}</p>
        <p>Count: {this.state.count}</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Increment
        </button>
      </div>
    );
  }
}

函数式组件

import React, { useState, useEffect } from 'react';

const FunctionalComponentWithState = (props) => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    // 这里可以处理副作用,类似于 componentDidMount 和 componentDidUpdate
    document.title = `Count: ${count}`;
  }, [count]);

  return (
    <div>
      <p>{props.message}</p>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

区别

class组件特点:

  • 有组件实例
  • 有生命周期
  • 有 state 和 setState

函数组件特点:

  • 没有组件实例
  • 没有生命周期
  • 没有 state 和 setState,只能接收 props
  • 函数组件是一个纯函数,执行完即销毁,无法存储 state

常用的hooks有哪些。

usestate,useEffect,usememo,useCallback,useReducer,useContext

自定义hooks。

自定义 Hooks 是一种用于在 React 函数式组件之间共享状态逻辑的机制。创建自定义 Hooks 可以帮助您将可复用的逻辑提取出来,以便在多个组件中共享。以下是使用和创建自定义 Hooks 时的一些建议和注意点:

使用自定义 Hooks 时的注意点:

  1. 命名规范:

    • 自定义 Hook 的命名应以 “use” 开头,这是 React 社区的一种约定,帮助开发者识别其为 Hook。
    function useCustomHook() {
      // ...
    }
    
  2. 多次使用:

    • 自定义 Hook 可以在一个或多个组件中使用,使得逻辑的重用更加灵活。
    function ComponentA() {
      const data = useCustomHook();
      // ...
    }
    
    function ComponentB() {
      const data = useCustomHook();
      // ...
    }
    
  3. 不包含组件生命周期:

    • 自定义 Hook 中不应包含与组件生命周期相关的逻辑,例如 componentDidMountcomponentDidUpdate。这样的逻辑应该由使用 Hook 的组件自行处理。
  4. 不依赖组件内部状态:

    • 自定义 Hook 应该是无状态的,不依赖组件内部的状态。如果 Hook 需要保存状态,应该通过 Hook 的返回值提供给组件。

创建自定义 Hooks 时的注意点:

  1. 返回值:

    • 自定义 Hook 应该返回一个可用于组件的值,通常是状态和更新状态的函数。确保返回值对于使用 Hook 的组件是直观和易用的。
    function useCustomHook() {
      const [value, setValue] = useState(initialValue);
      // 其他逻辑...
      return { value, setValue };
    }
    
  2. 参数:

    • 如果需要,可以通过参数将定制的配置传递给自定义 Hook。这样可以使 Hook 更灵活,适应不同的用例。
    function useCustomHook(config) {
      const [value, setValue] = useState(config.initialValue);
      // 其他逻辑...
      return { value, setValue };
    }
    
  3. 提取共享逻辑:

    • 将多个组件之间共享的逻辑提取到自定义 Hook 中,以确保逻辑的一致性和可维护性。
    function useSharedLogic() {
      // 共享逻辑...
    }
    
    function ComponentA() {
      useSharedLogic();
      // ...
    }
    
    function ComponentB() {
      useSharedLogic();
      // ...
    }
    
  4. 避免与组件耦合:

    • 自定义 Hook 应该是独立于组件的,不依赖于组件的实现细节。这有助于确保 Hook 的通用性和可重用性。
    // 不好的例子,过于与组件耦合
    function useBadCustomHook() {
      const [value, setValue] = useState(0);
      useEffect(() => {
        console.log("Component did mount");
      }, []);
      return { value, setValue };
    }
    
    // 好的例子,不与组件耦合
    function useGoodCustomHook() {
      const [value, setValue] = useState(0);
      return { value, setValue };
    }
    

使用和创建自定义 Hooks 时,遵循这些注意点可以帮助您创建出易于理解、复用和维护的逻辑。

为什么同一个hooks调用很多次,其不同的结果都能被保存并返回来。

跟vue的data一样,hooks本身也是函数,函数返回的数据是在函数内部生成的,每一次调用hook,都在函数内部生成一个新的数据并抛出,组件内部用变量接收后,相当于形成闭包,函数执行完,并不会摧毁函数的执行期上下文,所以变量也不会被释放。

手写一个useState的实现原理。

function useState(init) {
	let state;
	// useState无法保存函数
	if(typeof init === 'function') {
		state = init()
	} else {
		state = init
	}

	const setState = (change) => {
		// 判断一下是否传递过来的是函数
		if(typeof change === 'function') {
			// 如果是函数,调用,并将之前的state传过去,接收到的返回值作为新的state并赋值
			state = change(state)
		} else {
			// 如果不是函数,直接赋值
			state = change;
		}
	}	
	return [state, setState]
}

更多useState使用介绍请看
react使用usestate踩坑

useEffect如何消除副作用。

useeffect可以返回一个回调函数,函数体将在组件卸载前执行,用以消除副作用。

import React, { useEffect } from 'react';

function DOMManipulationComponent() {
  useEffect(() => {
    // 手动操作 DOM
    const element = document.getElementById('exampleElement');
    element.style.color = 'red';

    // 在组件卸载时进行清理操作
    return () => {
      element.style.color = ''; // 恢复原始样式
    };
  }, []); // 空数组表示仅在组件挂载和卸载时执行

  return <div id="exampleElement">DOM Manipulation Example</div>;
}

react如何优化每次父组件数据更新,子组件也会更新。

在 React 中,当父组件的数据更新时,子组件通常也会更新。React 通过 Virtual DOM 和一些智能的渲染机制来优化这个过程,确保只有实际发生变化的部分才会更新。然而,有时候我们可能需要进一步优化,以避免不必要的子组件更新。

以下是一些优化子组件更新的方法:

1. 使用 React.memo

React.memo 是一个高阶组件,用于对函数式组件进行浅层的 props 比较,以避免不必要的重新渲染。它可以用于包裹子组件,只有在传递给子组件的 props 发生变化时才会重新渲染。

import React, { memo } from 'react';

const MemoizedComponent = memo(({ data }) => {
  // 只有 data 发生变化时才会重新渲染
  return <div>{data}</div>;
});

2. 使用 shouldComponentUpdate

对于类组件,可以手动实现 shouldComponentUpdate 方法来控制组件是否应该更新。

class PureComponentClassComponent extends React.PureComponent {
  shouldComponentUpdate(nextProps) {
    // 只有当 nextProps.data 发生变化时才会重新渲染
    return nextProps.data !== this.props.data;
  }

  render() {
    return <div>{this.props.data}</div>;
  }
}

3. 将不变的函数移到外部:

确保传递给子组件的函数是不变的,以避免每次父组件更新时都重新生成函数。

function ParentComponent() {
  const handleClick = () => {
    // 处理点击事件
  };

  return <ChildComponent onClick={handleClick} />;
}

4. 使用 useCallback 和 useMemo:

使用 useCallbackuseMemo 来缓存函数和计算结果,以避免不必要的重新计算和函数生成。

import React, { useCallback, useMemo } from 'react';

function ParentComponent({ data }) {
  const handleClick = useCallback(() => {
    // 处理点击事件
  }, []);

  const processedData = useMemo(() => {
    // 计算结果
    return data.map(item => item * 2);
  }, [data]);

  return <ChildComponent data={processedData} onClick={handleClick} />;
}

5. 使用 React Developer Tools 分析性能:

使用 React Developer Tools 来检查组件的渲染和更新,找出造成不必要更新的原因。这可以帮助您更好地理解组件渲染的情况。

通过结合上述方法,您可以更精确地控制子组件的更新,从而提高应用程序的性能。请注意,这些优化方法的适用性取决于具体的使用场景,需要根据实际情况来选择和结合使用。

memo和useMemo的区别。

useMemo 是一个自定义 Hook,它用于在渲染过程中执行昂贵的计算,并缓存计算结果,以便在后续的渲染中重复使用。

React.memo 是一个高阶组件,用于对函数式组件进行浅层的 props 比较,如果组件的 props 没有发生变化,将会阻止不必要的重新渲染。

react虚拟dom。

虚拟 DOM(Virtual DOM)是 React 中一种用于提高性能的技术。它是一个内存中的表示,类似于真实 DOM 树的结构。React 使用虚拟 DOM 来进行高效的 DOM 操作,减少直接操作真实 DOM 的次数,从而提高应用性能。

以下是虚拟 DOM 的基本原理和工作流程:

1. 创建虚拟 DOM:

当 React 组件的状态(state)或属性(props)发生变化时,React 会重新渲染组件。在重新渲染之前,React 会创建一个新的虚拟 DOM 树,以表示更新后的组件结构。

2. 对比虚拟 DOM:

React 使用一种叫做“协调算法”的机制,来比较新的虚拟 DOM 树和之前的虚拟 DOM 树。这个算法能够找出两个树之间的差异(所谓的“差异树”)。

3. 计算差异:

通过计算差异,React 知道在更新真实 DOM 时应该做什么。这包括哪些节点需要被添加、删除、更新,以及如何更新它们。

4. 更新真实 DOM:

一旦计算出了差异,React 就会将这些变化应用到真实 DOM 上。为了尽可能减少对真实 DOM 的直接操作,React 采用了一种批处理的方式,将所有变更一次性应用到真实 DOM。

5. 提高性能:

由于虚拟 DOM 的存在,React 能够减少直接操作真实 DOM 的次数。通过批处理和智能的差异计算,React 能够更有效地更新用户界面,提高应用的性能。

虚拟 DOM 的优势:

  1. 性能提升: 通过在内存中进行比较和计算,减少直接操作真实 DOM 的次数,提高了性能。

  2. 跨平台兼容性: 虚拟 DOM 可以在不同平台上运行,使得 React 可以同时支持 Web、原生移动应用和其他平台。

  3. 方便的抽象层: 虚拟 DOM 提供了一个抽象层,使得开发者可以更方便地操作组件和状态,而不用过多关心底层的 DOM 操作。

虽然虚拟 DOM 为 React 带来了性能的提升,但并不是所有情况下都需要手动操作虚拟 DOM。React 提供了高度抽象的 API,大部分情况下开发者只需要关心组件的声明和状态更新,React 会自动处理虚拟 DOM 的创建和更新。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【5G PHY】5G SS/PBCH块介绍(三)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

C/C++ 实现获取硬盘序列号

获取硬盘的序列号、型号和固件版本号&#xff0c;此类功能通常用于做硬盘绑定或硬件验证操作&#xff0c;通过使用Windows API的DeviceIoControl函数与物理硬盘驱动程序进行通信&#xff0c;发送ATA命令来获取硬盘的信息。 以下是该程序的主要功能和流程&#xff1a; 定义常量…

使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(二)

本篇文章我们来继续聊聊轻量的向量数据库方案&#xff1a;Redis&#xff0c;如何完成整个图片搜索引擎功能。 写在前面 在上一篇文章《使用 Redis 构建轻量的向量数据库应用&#xff1a;图片搜索引擎&#xff08;一&#xff09;》中&#xff0c;我们聊过了构建图片搜索引擎的…

深度学习入门(第二天)——走进深度学习的世界 神经网络模型

反向传播计算方法 简单的例子&#xff1a; 如何让 f 值更小&#xff0c;就是改变x、y、z&#xff0c;而损失函数也是这样&#xff0c;那么我们分别求偏导&#xff0c;则能得出每个值对结果的影响 链式法则 梯度是一步一步传的 复杂的例子&#xff1a; 神经网络整体架构 类生…

浪涌防护器件要选对,布局布线更重要!|深圳比创达电子EMC(上)

浪涌测试&#xff0c;作为最常见的EMC抗干扰测试项目之一&#xff0c;基本上是家用消费电子必测的项目&#xff1b;其测试目的是为了验证产品在承受外部的浪涌冲击时能否正常工作。 一、浪涌冲击产生机理及其防护设计 浪涌冲击主要包括雷击浪涌冲击、电力系统内部的开关噪声冲…

假如我是AI Agent专家,你会问什么来测试我的水平

1. 假如我是AI Agent专家&#xff0c;你会问什么来测试我的水平 作为AI Agent专家&#xff0c;您可能需要回答一系列关于AI代理的设计、实现和优化方面的问题。以下是一些可能的问题&#xff1a; AI代理的基本原理&#xff1a;AI代理的基本工作原理是什么&#xff1f;它们如何…

requests库进行HTTP请求时,有时需要传递cookies参数

在使用requests库进行HTTP请求时&#xff0c;有时需要传递cookies参数。但是&#xff0c;requests库的cookies参数只能接受CookieJar对象&#xff0c;而不能接受字典等其他类型的cookies。 在requests库中增加对字典类型的cookies支持&#xff0c;使其能够接受字典类型的cooki…

linux高级篇基础理论二(详细文档、LAMP、SHELL、sed正则表达式)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

Coder OSS Enterprise 2.3.3 Crack

Coder OSS Enterprise是一个开源开发平台&#xff0c;旨在简化开发人员的编码流程。该平台专为企业级组织设计&#xff0c;具有针对大规模软件开发运营量身定制的功能。 首先&#xff0c;该软件提供了一个云环境&#xff0c;允许开发人员在任何地方使用任何设备处理他们的代码。…

Vue中el与data的两种写法

想必大家对Vue中的el与data并不陌生&#xff0c;接下来&#xff0c;让我为大家介绍一下el与data的两种写法吧&#xff01; 一、el的两种写法 1.new Vue时候配置e1属性。 2.先创建Vue实例&#xff0c;随后再通过vm.$mount(#root)指定el的值 <!DOCTYPE html> <html l…

结构工程师软件 Naviate Core MEP for Revit 3.4 Crk

Naviate Fabrication - 先进的建模和制造命令&#xff0c;可提高 VDC 设计师、细节设计师和承包商的生产力和收入。 Naviate MEP - 通过 MEP 工程师和设计师的建模和参数提高效率 导航架构 Naviate Architecture 完全集成到 Revit 平台中&#xff0c;增强了 BIM 提供的协作可能…

工业除尘器笔记

工业除尘器用于对工业生产产生的有害气体和粉尘进行吸附。相关标准的制定最早可以追溯到1960年代以前。注意&#xff0c;本文的附录包含一起完整的工业除尘器事故的分析和定责过程。相关事故分析定责文档源头摘自上海市政府网站。 在产品设计行业和关联下游行业&#xff0c;在…

java--俄罗斯方块

一、先看一下游戏运行时的画面 二、代码部分 1. Cell.java Cell.java&#xff1a; package demo1;import java.awt.image.BufferedImage; import java.util.Objects;/* 编写小方块类属性&#xff1a;行、列、每个小方格的图片方法&#xff1a;左移一格、右移一格、下落一格 …

【 云原生 | K8S 】kubeadm 部署Kubernetes集群

目录 1 环境准备 2 所有节点安装docker 3 所有节点安装kubeadm&#xff0c;kubelet和kubectl 4 部署K8S集群 4.1 查看初始化需要的镜像 4.2 初始化kubeadm 4.3 设定kubectl 4.4 所有节点部署网络插件flannel master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&am…

第一讲之递归与递推下篇

第一讲之递归与递推下篇 带分数费解的开关飞行员兄弟翻硬币 带分数 用暴力将所有全排列的情况都算出来 > 有三个数&#xff0c;a,b,c 每种排列情况&#xff0c;可以用两层for循环&#xff0c;暴力分为三个部分&#xff0c;每个部分一个数 当然注意这里&#xff0c;第一层fo…

Linux常用命令——bzdiff命令

在线Linux命令查询工具 bzdiff 直接比较两个.bz2压缩包中文件的不同 补充说明 bzdiff命令用于直接比较两个“.bz2”压缩包中文件的不同&#xff0c;省去了解压缩后再调用diff命令的过程。 语法 bzdiff(参数)参数 文件1&#xff1a;指定要比较的第一个.bz2压缩包&#xf…

《洛谷深入浅出基础篇》P1536 村村通——并查集

上链接&#xff1a;P1536 村村通 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1536 上题干&#xff1a; 题目描述 某市调查城镇交通状况&#xff0c;得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程…

全民运动时代,气膜建筑备受瞩目

气膜体育场馆&#xff0c;作为当今新型的临时建筑运动场馆&#xff0c;在满足大型体育赛事需求方面展现出显著的优势。相较于传统体育场馆&#xff0c;气膜建筑不仅拥有更宽敞的空间&#xff0c;而且造价成本更为经济&#xff0c;成为体育场馆领域备受关注的建筑形式。 气膜建筑…

郑州市管城区工信局局长任华民一行莅临中创算力调研指导工作

2023年11月15日&#xff0c;为深入了解企业生产经营情况&#xff0c;解决发展诉求。郑州市管城区工信局局长任华民等领导一行莅临中创算力&#xff0c;中创副总经理杨光、技术总监刘朝阳、行政主管生田等人员陪同调研。 调研期间&#xff0c;双方就生产经营、“算力数据中心”…

基于SSM的校园二手物品交易市场设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…