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) => (<TodoItemkey={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.mzph.cn/diannao/21777.shtml

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

相关文章

Java流与链表:探索java.util.stream与LinkedList的交汇点

在现代Java开发中&#xff0c;流&#xff08;Streams&#xff09;和链表&#xff08;LinkedList&#xff09;都是强大且常用的数据处理工具。java.util.stream提供了高效的方式来处理数据流&#xff0c;而LinkedList则是java.util包中的经典集合实现。本文将探索它们的交汇点&a…

【Java】接口详解

接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含静态常量。 一个简单的接口代码示例 interface IShape { void draw(); } class Cycle implements IShape { Override public void draw() { System.out.println…

【论文笔记】Content-based Unrestricted Adversarial Attack

图2&#xff1a;Adversarial Content Attack的流程。首先使用Image Latent Mapping将图像映射到潜变量空间。然后&#xff0c;用Adversarial Latent Optimization生成对抗性样本。最后&#xff0c;生成的对抗性样本可以欺骗到目标分类模型。 3.1 Image Latent Mapping 对于扩…

升级 macOS 12 之后,CleanMyMac 闪退怎么办?

​​好多朋友在升级 macOS 12 之后&#xff0c;发现 CleanMyMac 出现闪退问题&#xff0c;这可能是TNT的证书过期造成的&#xff0c;那么如何解决CleanMyMac闪退的问题呢&#xff1f; 今天给大家带来了三种解决方法&#xff0c;如下&#xff1a; 一、打开“终端”&#xff0c;运…

回溯算法常见思路

回溯问题 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个N个数的集合里有多少符合条件的子集排列问题&#xff1a;N个数…

for深入学习

目录 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 例2&#xff1a; 求0-100中含数字9个个数 作业&#xff1a; 练习&#xff1a; 例1&#xff1a; 求解0-100中整除3的数有哪些 代码&#xff1a; #include<stdio.h> int main() {printf("整…

揭秘!天工AI如何帮我轻松搞定产品经理工作,低调强大

聊到AI搜索&#xff0c;总会想起那句话&#xff1a;“领导者和追随者最大的区别在于创新” 作为一名AI产品经理&#xff0c;我深刻体会到搜索引擎对我们日常生活的重要性&#xff0c;在本文中我将会分享我是如何使用图文并茂的天工AI搜索引擎辅助我完成产品经理的工作。 从最初…

强大的机器学习建模扩展包:mlxtend

公众号&#xff1a;尤而小屋编辑&#xff1a;Peter作者&#xff1a;Peter 大家好&#xff0c;我是Peter~ 今天给大家介绍一个强大的机器学习建模扩展包&#xff1a;mlxtend。 mlxtend(machine learning extensions&#xff0c;机器学习扩展)是一个用于日常数据分析、机器学习…

LeetCode216组合总和3

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a;只使用数字1到9。每个数字 最多使用一次。返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 解析 递归加剪枝&#xff0c;搜索长度达…

基于JSP的美食推荐管理系统

你好呀&#xff0c;我是学长猫哥&#xff01;如果有需求可以文末加我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJavaBeansServlet 系统展示 首页 用户注册 用户登录 热门美食 摘要 本文介绍了一个基于JSP技术的美食推荐管理系统&#xff0…

企业内业务系统与Activiti流程引擎的结合(十一)

摘要:前文分享了企业内部系统集成Activiti的架构和API设计,这里再介绍下 bpmn 流程图的绘制以及与 流程图与bpm后台服务代码的结合点。 一、画流程图 以使用 eclipse 画流程图为例 1. 将 Activiti BPMN 插件安装到 eclipse 插件安装成本后的效果:新建向导中出现 Activiti…

ARM公司发展历程

Arm从1990年成立前开始&#xff0c;历经漫长岁月树立各项公司里程碑及产品成就&#xff0c;一步步成为全球最普及的运算平台。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; Acorn 时期 1978年&#xff0c;Chris Curry和Hermann Hauser共同创立了Acorn…

electron初学

最近有一个开发桌面端的业务&#xff0c;考虑到跨平台就使用了electron。 引用官网&#xff1a;Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows…

OpenAI 近期动荡:解雇 Sam Altman 事件分析与 AI 未来展望

引言 OpenAI 的动荡从未停止。最近&#xff0c;由于 OpenAI 高层领导的更迭&#xff0c;引发了广泛的关注和讨论。特别是在 Sam Altman 被解雇后&#xff0c;再次回归 CEO 职位的过程&#xff0c;更是引起了公众和业内的巨大反响。前 OpenAI 董事会成员 Helen Toner 在最新一期…

如何利用AI大模型给我写程序

文章目录 1&#xff0c;应用情景&#xff08;给文件夹里的图片批量重命名&#xff09;2&#xff0c;选择合适的AI大模型3&#xff0c;复制AI给出来的代码&#xff0c;在本地执行4&#xff0c;结果检查 1&#xff0c;应用情景&#xff08;给文件夹里的图片批量重命名&#xff09…

JasperReport-动态数据源数据填充

一、数据填充 在正式环境中,报表中的内容或数据通常是通过查询底层数据源获取然后再进行数据填充。JasperReport的JAVA SDK中,提供了多种方法提供数据填充(如下其中一个示例): /** * 填充数据构造JasperPrint * is: 文件输入流 * parameters:参数 * connection:数据源…

基于java的CRM客户关系管理系统(六)

目录 5.3 表现层设计 5.3.1 模型层&#xff08;M&#xff09; 5.3.2 视图层&#xff08;V&#xff09; 5.3.3 控制层&#xff08;C&#xff09; 5.4 系统主要功能模块的实现 5.4.1 登录功能的实现 5.4.2 客户管理的实现 5.5 本章小结 参考文献 前面内容请移步 基于java…

k8s学习--Secret详细解释与应用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Secret什么是Secret?Secret四种类型及其特点Secret应用案例&#xff08;1&#xff09;将明文密码进行base64编码&#xff08;2&#xff09;编写创建secret的YAML文…

笔试训练2

牛客.单词搜索 刚开始我就想是搜索&#xff0c;但是不清楚bfs还是dfs更好&#xff0c;我尝试了bfs但是队列存东西&#xff0c;没有我想象的那么好写&#xff0c;所以我决定试试dfs import java.util.*;public class Solution {static int m 0;static int n 0;static int […

【人工智能Ⅱ】实验8:生成对抗网络

实验8&#xff1a;生成对抗网络 一&#xff1a;实验目的 1&#xff1a;理解生成对抗网络的基本原理。 2&#xff1a;学会构建改进的生成对抗网络&#xff0c;如DCGAN、WGAN、WGAN-GP等。 3&#xff1a;学习在更为真实的数据集上应用生成对抗网络的方法。 二&#xff1a;实验…