Vue渲染函数与JSX指南


title: Vue渲染函数与JSX指南
date: 2024/6/3 下午6:43:53
updated: 2024/6/3 下午6:43:53
categories:

  • 前端开发
    tags:
  • Vue渲染
  • JSX基础
  • 性能优化
  • 组件对比
  • React JSX
  • 大项目
  • 测试策略

在这里插入图片描述

第1章:Vue.js入门

Vue.js的历史和背景

Vue.js是一个用于构建用户界面的JavaScript框架,旨在提供简单但功能强大的方法来构建动态Web应用程序。Vue.js最初于2014年由尤雨溪(Evan
You)发布,后来在GitHub上获得了大量关注和支持。Vue.js的设计灵感来自Angular和React,但Vue.js的核心目标是易于学习和使用。

安装和配置Vue开发环境

要开始使用Vue.js,首先需要安装Vue.js的开发环境。可以从Vue.js的官方网站下载和安装最新版本的Vue.js。

在安装Vue.js后,可以通过以下方式在HTML文件中使用Vue.js:

  1. 在HTML文件的<head>部分引入Vue.js:
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>

  1. 在HTML文件的<body>部分创建一个<div>元素,用于挂载Vue.js实例:
<div id="app">
  {{ message }}
</div>

  1. 在HTML文件的<script>部分创建一个Vue.js实例,并将其挂载到<div>元素上:
<script>
  const app = new Vue({
    el: '#app',
    data: {
      message: 'Hello Vue.js!'
    }
  })
</script>

Vue组件的基本概念

Vue.js的核心是组件化编程。组件是可重用的、可组合的、自包含的Vue.js实例。组件可以包含自己的数据、计算属性、方法、生命周期钩子函数以及模板。

在Vue.js中,可以使用<template>标签来定义组件的模板。组件的数据可以通过data选项来定义,计算属性可以通过computed
选项来定义,方法可以通过methods选项来定义。

组件可以通过props选项来接收外部数据。props选项是一个数组或对象,包含了组件可以接收的数据项。

Vue实例的生命周期

Vue.js实例和组件在被创建和销毁时会经过一系列的生命周期阶段。这些生命周期阶段可以通过生命周期钩子函数来监听和操作。

在Vue.js中,可以通过以下生命周期钩子函数来监听生命周期事件:

  • beforeCreate:在数据观测和初始化事件或 watches 时调用。
  • created:在实例创建完成后立即调用。
  • beforeMount:在挂载开始之前被调用。
  • mounted:在实例被挂载后调用。
  • beforeUpdate:在数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
  • updated:在由于数据更改导致的虚拟 DOM 重新渲染和打补丁之后调用。
  • beforeDestroy:在实例销毁之前调用。
  • destroyed:在实例销毁后调用。

第2章:模板语法

插值表达式

插值表达式用于将文本与数据绑定在一起。在Vue.js中,使用双花括号{{ }}包裹的表达式会被当作 JavaScript 表达式进行插值。例如:

<div>{{ message }}</div>

这里的message是Vue实例的一个数据属性。当message的值发生变化时,插值表达式所在的内容也会相应更新。

指令

Vue.js提供了多种指令,用于执行不同的任务。指令是以v-开头的行为动词。

  • v-bind:用于动态绑定一个或多个属性值到表达式。
  • v-model:用于在表单输入和应用状态之间建立双向绑定。
  • v-for:用于基于一个数组渲染一个列表。
  • v-ifv-else-ifv-else:用于条件渲染。
  • v-on:用于监听DOM事件。

例如,使用v-bind指令绑定一个类名:

<div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>

条件渲染

条件渲染用于根据条件显示或隐藏元素。

  • v-if:条件为真时渲染元素,为假时跳过。
  • v-else-if:当v-if的条件为假,且v-else-if的条件为真时渲染元素。
  • v-else:当v-ifv-else-if的条件都为假时渲染元素。

例如,根据一个布尔值渲染不同的内容:

<p v-if="isTrue">这是真的</p>
<p v-else-if="isFalse">这是假的</p>
<p v-else>条件未知</p>

列表渲染

列表渲染用于遍历数组或对象,并生成列表。

<ul>
  <li v-for="(item, index) in items" :key="index">
    {{ item.text }}
  </li>
</ul>

在这个例子中,v-for指令遍历items数组,为每个元素生成一个li元素。:key是一个特殊的属性,它帮助Vue追踪每个节点的身份,从而重用和重新排序现有元素。

事件处理

事件处理指令用于监听DOM事件,并执行相应的JavaScript代码。

<button v-on:click="handleClick">点击我</button>

在这个例子中,当按钮被点击时,handleClick方法会被调用。Vue.js还提供了其他事件修饰符,如.stop.prevent.capture
.self,用于控制事件冒泡、阻止默认行为等。

第3章:渲染函数简介

什么是渲染函数

渲染函数是一个用于生成 VNode(虚拟 DOM 节点)的函数。它是 Vue.js 中一种底层的 API,用于渲染视图。

渲染函数的作用

渲染函数的主要作用是让我们可以更加灵活地控制 Vue.js 的渲染过程。在某些情况下,使用渲染函数可以更好地优化性能,或者更好地实现复杂的
UI 结构。

如何在 Vue 中使用渲染函数

在 Vue 中使用渲染函数需要使用render函数属性。render函数接收一个createElement函数作为参数,用于创建 VNode。

例如,创建一个简单的渲染函数:

<template>
  <div>
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello World!'
    }
  },
  render(createElement) {
    return createElement('h1', this.message)
  }
}
</script>

在这个例子中,我们使用render函数代替了模板。createElement函数接收三个参数:标签名、数据对象和子节点。在这个例子中,我们只使用了标签名和数据对象。

数据对象可以包含以下属性:

  • class:用于设置元素的类名。
  • style:用于设置元素的内联样式。
  • props:用于设置元素的属性。
  • domProps:用于设置原生 DOM 属性。
  • on:用于设置事件监听器。

第4章:创建渲染函数

基本渲染函数的实现

在 Vue 中,你可以通过定义render函数来自定义组件的渲染行为。以下是一个基本渲染函数的例子:

<template>
  <div>
    <h1>{{ message }}</h1>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello Vue!',
      count: 0
    }
  },
  methods: {
    increment() {
      this.count += 1
    }
  },
  render(createElement) {
    return createElement('div', [
      createElement('h1', this.message),
      createElement('p', this.count),
      createElement('button', {
        on: { click: this.increment }
      }, 'Increment')
    ])
  }
}
</script>

在这个例子中,render函数使用createElement方法来创建 DOM 元素。createElement接受三个参数:标签名、属性对象和一个子节点数组。

使用渲染函数优化性能

渲染函数允许你直接操作虚拟
DOM,因此你可以利用它来优化性能。例如,通过避免不必要的渲染来提高性能。你可以使用shouldComponentUpdate生命周期钩子来控制组件是否应该更新:

export default {
  data() {
    return {
      message: 'Hello Vue!',
      count: 0
    }
  },
  methods: {
    increment() {
      this.count += 1
    }
  },
  render(createElement) {
    return createElement('div', [
      createElement('h1', this.message),
      createElement('p', this.count)
    ])
  },
  shouldComponentUpdate(nextProps, nextState) {
    // 只有当 message 或 count 发生变化时才更新组件
    return nextProps.message !== this.message || nextState.count !== this.count
  }
}

函数式渲染与普通渲染的比较

函数式渲染与普通渲染(使用模板)的主要区别在于灵活性和控制能力。函数式渲染提供了更多的控制权,允许你手动管理组件的更新,从而在某些情况下可以实现更高的性能优化。

普通渲染(模板)更加直观和易用,大多数情况下可以满足开发需求。它提供了数据绑定和组件化的便利,使得开发更加快速。

函数式渲染(render函数)适合于:

  • 需要深度定制渲染逻辑的情况。
  • 需要手动优化渲染性能的情况。
  • 需要从底层的虚拟 DOM 操作中获益的情况。

普通渲染(模板)适合于:

  • 大多数标准的组件开发。
  • 当渲染逻辑相对简单时。
  • 当性能不是主要考虑因素时。

在选择函数式渲染还是普通渲染时,需要根据具体的需求和场景来决定。

第5章:渲染函数与组件

如何在组件中使用渲染函数

在 Vue 组件中使用渲染函数,你需要在组件的选项中定义一个render函数。这个函数将替代模板,直接返回虚拟 DOM
结构。以下是如何在组件中使用渲染函数的示例:

export default {
  data() {
    return {
      message: 'Hello Vue!',
      count: 0
    }
  },
  methods: {
    increment() {
      this.count += 1
    }
  },
  render(createElement) {
    return createElement('div', [
      createElement('h1', this.message),
      createElement('p', this.count),
      createElement('button', {
        on: { click: this.increment }
      }, 'Increment')
    ])
  }
}

在这个例子中,render函数接收一个createElement方法作为参数,这个方法用于创建虚拟 DOM 元素。createElement
方法的第一个参数是标签名,第二个参数是属性对象,第三个参数是子元素数组。

组件内的渲染函数

组件内的渲染函数允许你完全控制组件的渲染逻辑。你可以根据组件的状态和属性来动态生成虚拟 DOM。这种方式提供了极高的灵活性,但同时也要求开发者对
Vue 的虚拟 DOM 系统有深入的理解。

渲染函数与虚拟DOM

渲染函数与虚拟 DOM 紧密相关。在 Vue 中,渲染函数返回的是虚拟 DOM 节点,这些节点是由createElement方法创建的。虚拟 DOM
是一种编程概念,它允许你在内存中以 JavaScript 对象的形式表示 DOM 结构,而不是直接操作真实的 DOM。

使用虚拟 DOM 的好处包括:

  1. 性能优化:通过比较新旧虚拟 DOM 树的差异,Vue 可以最小化实际 DOM 操作,从而提高性能。
  2. 跨平台能力:虚拟 DOM 可以被渲染到不同的环境中,如浏览器、移动端或桌面应用,甚至可以用于服务器端渲染。
  3. 开发效率:虚拟 DOM 允许开发者以声明式的方式编写应用,而不是直接操作 DOM,这通常使得代码更易于理解和维护。

在渲染函数中,你可以直接操作这些虚拟 DOM 节点,创建、修改或删除它们,而不必担心直接操作真实 DOM 带来的性能开销。

第6章:JSX基础

JSX的介绍

JSX 是 JavaScript 的一种语法扩展,它允许在 JavaScript 代码中编写 HTML 样式的标记。JSX 的主要目的是使组件的开发更加简单和直观。

JSX 的基本语法如下:

const element = <h1>Hello, world!</h1>;

上面的代码创建了一个h1标签,并将其渲染为一个 React 元素。

JSX与HTML的比较

JSX 与 HTML 在语法上有一些区别,以下是它们之间的主要差异:

  1. 标签名:JSX 标签名使用驼峰命名法,例如<div>在 JSX 中写作<Div>
  2. 属性:JSX 属性使用驼峰命名法,例如class在 JSX 中写作className
  3. 自闭合标签:JSX 中的所有标签都必须有一个闭合标签,即使它们在 HTML 中可以省略闭合标签,例如<br>在 JSX
    中写作<br />
  4. 子元素:JSX 中的子元素可以是任意类型的 JavaScript 表达式,包括数组、函数、变量等。

第7章:JSX语法

JSX标签与属性

JSX 标签在语法上类似于 HTML 标签,但它们是 React 组件的语法糖。在 JSX 中,你可以使用表达式来创建动态内容,这些表达式会在渲染时求值。

示例:
const message = 'Hello, world!';

function getGreeting() {
  return 'Hello';
}

const element = (
  <h1>
    {getGreeting()}, {message}
  </h1>
);

在这个例子中,getGreeting()是一个函数调用,message是一个变量,它们都包含在{}内,这表示它们将在渲染时求值。

JSX表达式

JSX 表达式可以是任何有效的 JavaScript 表达式。它们可以包含运算符、函数调用、变量等。JSX 表达式会在组件渲染时求值。

示例:
const count = 42;
const element = <h1>The answer to life, the universe, and everything is {count}</h1>;

在这个例子中,count是一个变量,它的值将会在渲染时插入到h1标签中。

JSX与Vue数据绑定

Vue 中的数据绑定是通过v-modelv-bindv-ifv-for等指令实现的。在 JSX 中,你可以使用类似的语法来实现相同的功能。

示例:
const App = {
  data() {
    return {
      message: 'Hello, world!'
    };
  },
  render(h) {
    return (
      <div>
        <h1>{this.message}</h1>
        <input type="text" value={this.message} onInput={(event) => { this.message = event.target.value; }} />
      </div>
    );
  }
};

在这个 Vue JSX 示例中,我们使用了this.message来访问 Vue 实例的数据。value={this.message}相当于 Vue 中的v-model
,它建立了输入框和数据之间的双向绑定。onInput属性是一个事件处理器,它监听输入框的输入事件,并更新this.message的值。
AD:漫画首页

需要注意的是,在 Vue 中使用 JSX 时,你需要确保render函数接收到了h函数作为参数,因为h函数是创建虚拟 DOM 元素的关键。同时,Vue
的数据绑定和事件处理在 JSX 中遵循 React 的语法习惯,但背后的机制是由 Vue 的响应式系统支持的。

第8章:在组件中使用JSX

JSX组件定义

在 JSX 中,你可以使用函数或类来定义组件。这些组件可以接收参数(称为 props),并可以渲染 JSX 元素。

示例:
function Welcome(props) {
  return <h1>Hello, {props.name}!</h1>;
}

const element = <Welcome name="Sara" />;

在这个例子中,我们定义了一个名为Welcome的函数组件,它接收一个名为props的参数,并渲染一个带有文本的h1标签。Welcome
组件的使用方式类似于 HTML 标签,我们可以使用<Welcome name="Sara" />来渲染该组件。

JSX与组件状态

在 JSX 中,你可以使用类中的state来管理组件的状态。state是一个对象,它包含了组件的数据。你可以在构造函数中初始化state
,并在其他地方修改它。

示例:
class Timer extends React.Component {
  constructor(props) {
    super(props);
    this.state = { seconds: 0 };
  }

  tick() {
    this.setState(state => ({
      seconds: state.seconds + 1
    }));
  }

  componentDidMount() {
    this.interval = setInterval(() => this.tick(), 1000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  render() {
    return <div>Seconds: {this.state.seconds}</div>;
  }
}

const element = <Timer />;

在这个例子中,我们定义了一个名为Timer的类组件。Timer组件有一个名为seconds的状态,它是一个计数器,每秒递增
1。componentDidMount生命周期方法用于设置计时器,componentWillUnmount生命周期方法用于清除计时器。render方法用于渲染当前计数器的值。

JSX与事件处理

在 JSX 中,你可以使用类中的onEvent属性来处理事件。这些属性可以接收一个函数,当事件发生时,该函数将会被调用。

示例:
class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = { isToggleOn: true };
  }

  handleClick() {
    this.setState(state => ({
      isToggleOn: !state.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={() => this.handleClick()}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

const element = <Toggle />;

在这个例子中,我们定义了一个名为Toggle的类组件。Toggle组件有一个名为isToggleOn
的状态,它是一个布尔值,表示按钮是否处于激活状态。handleClick方法用于切换isToggleOn的值。render
方法用于渲染一个按钮,该按钮的文本取决于isToggleOn的值。当按钮被点击时,handleClick方法将会被调用。
AD:专业搜索引擎

第9章:自定义渲染函数与JSX

创建自定义渲染函数

在 React 中,除了使用类来定义组件,还可以使用函数来替代,这种函数被称为渲染函数。它接收 props 和 state 作为参数,并返回一个
React 元素。函数组件没有生命周期方法,但可以使用useRefuseState等 hooks 来实现更复杂的功能。

function CustomComponent({ name }) {
  return (
    <div>
      <h1>Hello, {name}!</h1>
      <p>This is a custom component.</p>
    </div>
  );
}

const customElement = <CustomComponent name="John" />;

使用JSX进行复杂渲染

JSX 可以嵌套和包含复杂的结构,可以用来渲染列表、条件渲染、循环等。例如,渲染一个包含多个元素的列表:

function UserList(users) {
  return (
    <ul>
      {users.map(user => (
        <li key={user.id}>
          {user.name} - {user.email}
        </li>
      ))}
    </ul>
  );
}

const userList = <UserList users={[
  { id: 1, name: 'John', email: 'john@example.com' },
  { id: 2, name: 'Jane', email: 'jane@example.com' }
]} />;

渲染函数与JSX的组合使用

在函数组件中,你可以直接写 JSX 代码,也可以在函数内部返回 JSX。这两种方式可以混合使用,以实现更灵活的组件设计。

function DisplayData(data) {
  return (
    <div>
      {data && (
        <div>
          Name: {data.name}, Age: {data.age}
          {data.items && (
            <ul>
              {data.items.map(item => <li key={item.id}>{item.name}</li>)}
            </ul>
          )}
        </div>
      )}
    </div>
  );
}

const displayElement = <DisplayData data={{ name: 'Alice', age: 30, items: [{ id: 1, name: 'Item1' }] }} />;

在这个例子中,DisplayData是一个函数组件,它接收一个dataprop。根据data
是否存在及其结构,它动态地渲染不同的内容,包括姓名、年龄以及可能的子项列表。AD:首页 | 一个覆盖广泛主题工具的高效在线平台

第10章:性能优化

渲染函数与JSX的性能考量

当使用渲染函数和JSX时,性能优化是一个重要的考虑因素。React 组件的性能主要受到以下因素的影响:

  1. 组件的复杂性:组件层次越深,渲染和更新时的工作量越大。
  2. 组件的大小:大组件会占用更多内存,影响渲染速度。
  3. 渲染频率:频繁渲染会占用CPU资源,影响性能。
  4. DOM操作:减少DOM操作可以提高性能。

优化技巧与策略

为了提高渲染函数和JSX的性能,可以采取以下优化措施:

  1. 使用懒加载:对于不立即需要的组件,可以使用动态导入(Dynamic Imports)或懒加载(Lazy Loading)技术。
  2. 复用组件:创建可复用的组件可以减少代码量和重复渲染的工作。
  3. 优化组件结构:减少不必要的组件层级,简化组件结构。
  4. 使用虚拟化:对于长列表等大量元素,使用虚拟滚动(Virtual Scroll)可以大幅提升性能。
  5. 剔除不可见内容:使用React.PureComponentReact.memo来避免不必要的渲染,或者使用useCallbackuseMemo
    来优化函数和变量的传递。
  6. 合理使用 state 和 props:避免在渲染函数中直接修改 state 或 props,而是在组件内部使用setState或状态提升。
  7. 优化事件处理:减少事件监听器的数量,使用useEvent等钩子来优化事件处理。
  8. 使用生产版本的库文件:开发时使用的是库的开发版本,它包含了警告和完整的错误检查。在生产环境中,应该使用压缩和优化过的库版本。

性能工具的使用

为了诊断和优化性能,React 提供了一些内置的工具和外部库:

  1. React DevTools:React 的官方调试工具,可以帮助你监控组件的渲染和状态变化。
  2. performanceAPI:浏览器提供的API,可以用来分析和获取页面性能信息。
  3. React Profiler:React 提供的性能分析工具,可以查看组件的渲染时间和内存占用。
  4. Craco(Config React App Configuration):一个配置工具,可以帮助你定制 Create React App 的配置,包括性能配置。
  5. Webpack Bundle Analyzer:一个可视化工具,可以帮助你分析打包后的文件大小和依赖关系。

第11章:实战案例

构建一个使用渲染函数与JSX的待办事项应用

项目概述

我们将构建一个简单的待办事项应用,用户可以添加、删除和标记待办事项为完成。这个应用将展示如何使用渲染函数和JSX来创建动态和交互式的用户界面。

技术栈
  • React
  • React Hooks(如 useState, useEffect)
  • CSS 或 styled-components 用于样式
步骤
  1. 设置项目

    • 使用 Create React App 创建一个新的 React 项目。
    • 安装必要的依赖,如 styled-components(如果选择使用)。
  2. 创建组件

    • 创建一个TodoList组件,用于显示所有的待办事项。
    • 创建一个TodoItem组件,用于显示单个待办事项的详细信息。
    • 创建一个AddTodo组件,用于添加新的待办事项。
  3. 实现功能

    • TodoList组件中,使用useState来管理待办事项的状态。
    • TodoItem组件中,使用props来接收待办事项的数据,并实现删除和标记完成的功能。
    • AddTodo组件中,使用表单和事件处理来添加新的待办事项。
  4. 样式设计

    • 使用 CSS 或 styled-components 来设计应用的外观和感觉。
  5. 测试和优化

    • 测试应用的各个功能,确保没有错误。
    • 优化性能,例如通过使用React.memo来避免不必要的渲染。
代码示例
import React, { useState } from 'react';

function TodoList() {
  const [todos, setTodos] = useState([]);

  const addTodo = (text) => {
    setTodos([...todos, { text, completed: false }]);
  };

  const toggleTodo = (index) => {
    const newTodos = [...todos];
    newTodos[index].completed = !newTodos[index].completed;
    setTodos(newTodos);
  };

  const removeTodo = (index) => {
    const newTodos = [...todos];
    newTodos.splice(index, 1);
    setTodos(newTodos);
  };

  return (
    <div>
      <AddTodo onAdd={addTodo} />
      {todos.map((todo, index) => (
        <TodoItem
          key={index}
          text={todo.text}
          completed={todo.completed}
          onToggle={() => toggleTodo(index)}
          onRemove={() => removeTodo(index)}
        />
      ))}
    </div>
  );
}

function TodoItem({ text, completed, onToggle, onRemove }) {
  return (
    <div>
      <input type="checkbox" checked={completed} onChange={onToggle} />
      <span style={{ textDecoration: completed ? 'line-through' : 'none' }}>{text}</span>
      <button onClick={onRemove}>删除</button>
    </div>
  );
}

function AddTodo({ onAdd }) {
  const [text, setText] = useState('');

  const handleSubmit = (event) => {
    event.preventDefault();
    if (text.trim()) {
      onAdd(text);
      setText('');
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" value={text} onChange={(e) => setText(e.target.value)} />
      <button type="submit">添加</button>
    </form>
  );
}

export default TodoList;

渲染函数与JSX在大型项目中的应用

在大型项目中,渲染函数和JSX的应用更为复杂,需要考虑以下几个方面:

  1. 组件拆分:将大型组件拆分为更小的、可复用的组件,以提高代码的可维护性和可读性。
  2. 状态管理:使用 Redux 或 Context API 等状态管理工具来管理应用的状态,确保状态的一致性和可预测性。
  3. 性能优化:使用React.memo,useCallback,useMemo等优化技术来减少不必要的渲染。
  4. 代码分割:使用动态导入(Dynamic Imports)和 React 的懒加载(Lazy Loading)功能来优化应用的加载时间。
  5. 测试:编写单元测试和集成测试来确保代码的质量和稳定性。

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

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

相关文章

模拟堆-java

模拟堆也是对堆的一次深入理解和一些其它操作&#xff0c;可以了解一下。 文章目录 前言 一、模拟堆 二、算法思路 1.结点上移 2.结点下移 3.插入一个数 4.输出当前集合的最小值 5.删除当前集合的最小值&#xff08;数据保证此时的最小值唯一&#xff09; 6.删除第k个插入的数 …

初识STM32单片机-ADC和DMA

初识STM32单片机-ADC和DMA 一、ADC(模拟数字转换器)简介二、ADC基本结构三、DMA(直接存储器读取)简介四、DMA框图和基本结构五、DMA应用实例5.1 数据转运DMA5.2 ADC扫描DMA 六、程序编码6.1 ADC单通道-电位器6.2 ADC多通道-电位器和光敏\热敏\反射红外传感器6.3 DMA数据转运6.4…

代码随想录算法训练Day28|LeetCode93-复原IP地址、LeetCode78-子集问题、LeetCode90-子集2

复原IP地址 题目描述 力扣93-复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 …

贝锐花生壳DDNS:远程访问数据库,仅需简单3步

在当今数字化时代&#xff0c;数据的远程访问和管理变得至关重要。无论是企业还是个人开发者&#xff0c;都需要一种简单、安全的方式来远程访问和管理本地部署的数据库&#xff0c;如MySQL、PostgreSQL、MongoDB等。贝锐花生壳DDNS服务提供了一个完美的解决方案&#xff0c;通…

【YOLOv10改进[Backbone]】图像修复网络AirNet助力YOLOv10目标检测效果 + 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

本文带来的是图像复原网络AirNet&#xff0c;它由基于对比度的退化编码器( CBDE )和退化引导的恢复网络( DGRN )两个模块组成。可以在一个网络中恢复各种退化图像。AirNet不受损坏类型和级别的先验限制&#xff0c;仅使用观察到的损坏图像进行推理。本文中将使用图像修复网络Ai…

SCARA机器人中旋转花键的维护和保养方法!

作为精密传动元件的一种&#xff0c;旋转花键在工作过程中承受了较大的负荷。在自动化设备上运用广泛&#xff0c;如&#xff1a;水平多关节机械手臂&#xff08;SCARA&#xff09;、产业用机器人、自动装载机、雷射加工机、搬运装置、机械加工中心的ATC装置等&#xff0c;最适…

R语言安装caret包报错

R语言安装caret包报错&#xff1a;Error: package or namespace load failed for ‘caret’ in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck vI[[i]]): 不存在叫‘recipes’这个名字的程辑包 https://rbasics.org/packages/caret-package-in-r/ R版本的问题&…

什么牌子的洗地机清洁效果强?618热门品牌推荐与详解

近年来&#xff0c;洗地机的销量急剧增长&#xff0c;已成为清洁类家电中销量第二大的产品。其更新迭代速度也非常快&#xff0c;功能和技术层出不穷&#xff0c;许多消费者不知道如何选择合适的型号。为了帮助大家以最少的花费买到清洁力强的洗地机&#xff0c;笔者特意总结了…

输入法不显示选字框

期望效果&#xff1a; 当前效果&#xff1a; 啥也没干突然就这样了 原因&#xff1a;需要以兼容性运行微软输入法 一、进入输入法设置 右键输入法小图标 选择设置 二、进入常规设置 三、开启兼容性运行 完&#xff01;

跨越百亿营收的今世缘,全国化进程仍挑战重重?

当前&#xff0c;白酒市场正在经历一场深度调整&#xff0c;随着存量时代到来&#xff0c;白酒品牌地位的更替和竞争格局的重构已经展开。这一背景下&#xff0c;今世缘等地方性酒企也正在凭借对区域市场的深耕&#xff0c;展现出较快的成长速度&#xff0c;并希望能借此占领市…

【JAVA |总结】JAVASE基础大总结(含思维导图)

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

数据动态变化时实现多选及回显

<template><el-dialog title"设置权限" :visible.sync"showDialog" :close-on-click-modal"false" :append-to-body"true" width"800px"><div v-loading"loading"><el-radio-group v-model&…

TDMQ CKafka 版弹性存储能力重磅上线!

导语 自 2024年5月起&#xff0c;TDMQ CKafka 专业版支持弹性存储能力&#xff0c;这种产品形态下&#xff0c;存储可按需使用、按量付费&#xff0c;一方面降低消费即删除、存储使用波动大场景下的存储成本&#xff0c;另一方面存储空间理论上无穷大。 TDMQ CKafka 版产品能…

微服务网关Gateway(上)

大家好呀&#xff0c;我是苍何。 这年头&#xff0c;大家都在开始卷简历了&#xff0c;我也看了很多同学的简历&#xff0c;其中有一个同学的简历&#xff0c;我印象最为深刻&#xff0c;他的项目经历中&#xff0c;写了自定义 Gateway 过滤器实现统计接口调用耗时&#xff0c…

【Hive SQL 每日一题】统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…

什么是研学活动?快速了解

说起什么是研学活动&#xff0c;其实就是一种结合学习与实地考察、体验的教育方式&#xff0c;旨在通过实践活动深化学生对课堂知识的理解和应用&#xff0c;培养学生的综合素质和创新能力。让学生在亲身体验中学习和成长。当学校宣布即将组织一次研学活动时&#xff0c;孩子们…

如何批量复制文件名?文件名批量提取的5个工具!(2024新)

在数字化时代&#xff0c;我们经常需要处理大量的文件&#xff0c;其中批量复制文件名或批量提取文件名成为一项常见的任务。这不仅可以提高我们的工作效率&#xff0c;还能使文件管理更为有序。本文将介绍五种2024年最新的文件名批量提取工具&#xff0c;帮助你轻松完成文件名…

手把手教你从0到1开发浏览器插件

使用Chrome插件可以为Chrome浏览器带来一些功能性的扩展&#xff0c;进而提高使用体验&#xff1b;俗话说的好Chrome没插件&#xff0c;香味少一半&#xff0c;Chrome最大的优势还是其支持众多强大好用的扩展程序&#xff1b;今天就来了解一下插件是如何开发的&#xff0c;和普…

C语言基础——数组(2)

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言 一、二维数组的创建 1.1 二维数组的概念 1.2二维数组的创建 二、二维数组…

MySQL中获取时间的方法

大家好&#xff0c;在MySQL数据库开发中&#xff0c;获取时间是一个常见的需求。MySQL提供了多种方法来获取当前日期、时间和时间戳&#xff0c;并且可以对时间进行格式化、计算和转换。 以下是一些常用的MySQL时间函数及其示例&#xff1a; 1、NOW()&#xff1a;用于获取当前…