二八(vue2-04)、scoped、data函数、父子通信、props校验、非父子通信(EventBus、provideinject)、v-model进阶

1. 组件的三大组成部分(结构/样式/逻辑)

1.1 scoped 样式冲突

App.vue

<template>
  <!-- template 只能有一个根元素 -->
  <div id="app">
    <BaseOne></BaseOne>
    <BaseTwo></BaseTwo>
  </div>
</template>

<script>
/* 
  组件的样式冲突 scoped
  默认情况:写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。
  1. 全局样式: 默认组件中的样式会作用到全局
  2. 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组件

  scoped原理?
  1. 当前组件内标签都被添加 data-v-hash值 的属性
  2. css选择器都被添加 [data-v-hash值] 的属性选择器
  最终效果: 必须是当前组件的元素, 才会有这个自定义属性, 才会被这个样式作用到
*/
import BaseOne from "./components/BaseOne.vue";
import BaseTwo from "./components/BaseTwo.vue";
export default {
  components: {
    BaseOne,
    BaseTwo,
  },
};
</script>

<style>
/* el 根实例独有, data 是一个函数, 其他配置项一致 */
</style>

BaseOne.vue

<template>
  <div class="BaseOne">one</div>
</template>

<script>
export default {};
</script>

<style scoped>
div {
  width: 50px;
  height: 50px;
  background-color: pink;
}
</style>

BaseTwo.vue

<template>
  <div class="BaseTwo">
    two
    <h4>h4</h4>
  </div>
</template>

<script>
export default {};
</script>

<style scoped>
div {
  width: 100px;
  height: 100px;
  background-color: green;
}
</style>

1.2 data是一个函数

App.vue

<template>
  <div id="app">
    <!-- 每个实例有自己独立的状态和方法 -->
    <BaseCount></BaseCount>
    <BaseCount></BaseCount>
    <BaseCount></BaseCount>
  </div>
</template>

<script>
import BaseCount from "./components/BaseCount.vue";
export default {
  components: {
    BaseCount,
  },
};
</script>

<style>
</style>

BaseCount.vue

<template>
  <div class="BaseCount">
    <button @click="count--">-</button>
    <span>{{ count }}</span>
    <button @click="count++">+</button>
  </div>
</template>

<script>
export default {
  // `data` property in component must be a function
  // data:{}

  // 一个组件的 data 选项必须是一个函数。→ 保证每个组件实例,维护独立的一份数据对象。
  // 每次创建新的组件实例,都会新执行一次 data 函数,得到一个新对象。
  data() {
    return {
      count: 100,
    };
  },
};
</script>

<style scoped>
span {
  margin: 20px;
}
</style>

2. 组件通信

2.1 组件通信语法

/* 
  组件通信, 就是指 组件与组件 之间的数据传递。
  1. 组件的数据是独立的,无法直接访问其他组件的数据。
  2. 想用其他组件的数据 → 组件通信

  组件关系分类:1. 父子关系 2. 非父子关系
  组件通信解决方案:
  1. 父子关系: props $emit
  2. 非父子关系: provide&inject eventbus
  3. 通用解决方案: Vuex(适合复杂业务场景)
*/

2.2 父子通信

App.vue

<template>
  <!-- 03-src-父子通信 -->
  <div id="app">
    <!-- 1. 父 → 子: 父组件通过 props 将数据传递给子组件 -->
    <!-- 1.1 给子组件以添加属性的方式传值 :title="myTitle" -->
    <!-- <MySon :title="myTitle"></MySon> -->

    <!-- 2.2 父组件监听$emit触发的事件 @changeTitle="handleChange" -->
    <MySon :title="myTitle" @changeTitle="handleChange"></MySon>
  </div>
</template>

<script>
import MySon from "./components/MySon.vue";
export default {
  components: {
    MySon,
  },
  data() {
    return {
      myTitle: "你好,世界",
    };
  },
  methods: {
    // 2.3 提供处理函数,在函数的形参中获取传过来的参数
    handleChange(val) {
      this.myTitle = val;
    },
  },
};
</script>

<style>
</style>

MySon.vue

<template>
  <div class="MySon">
    子组件
    <!-- 1.3 模板中直接使用 props 接收的值 {{ title }} -->
    {{ title }}
    <button @click="changeFn">修改</button>
  </div>
</template>

<script>
export default {
  // 1.2 子组件内部通过 props 接收 props: ["title"]
  props: ["title"],
  methods: {
    changeFn() {
      // console.log(this);

      // 2. 子 → 父: 子组件利用 $emit 通知父组件,进行修改更新
      // 2.1 $emit 触发事件,给父组件发送消息通知
      // 触发一个名为 changeTitle 的事件,并传递数据 '修改成功'
      // this.$emit("事件名称", "传递修改的内容")
      this.$emit("changeTitle", "修改成功");
    },
  },
};
</script>

<style scoped>
span {
  margin: 20px;
}
</style>

2.3 props 传值 - 案例个人信息

App.vue

<template>
  <!-- 04-src-props传值 -->
  <div id="app">
    <!-- 1.2 父级填坑 :username="username" -->
    <!-- 2.2 父级收到通知 @changeName="handleName" -->
    <UserInfo
      :username="username"
      :age="age"
      :isSingle="isSingle"
      :car="car"
      :hobby="hobby"
      @changeName="handleName"
    ></UserInfo>
  </div>
</template>

<script>
import UserInfo from "./components/UserInfo.vue";
export default {
  data() {
    return {
      username: "小帅",
      age: 28,
      isSingle: true,
      car: {
        brand: "宝马",
      },
      hobby: ["篮球", "足球", "羽毛球"],
    };
  },
  components: {
    UserInfo,
  },
  methods: {
    handleName(val) {
      // 2.3 父级修改数据
      this.username = val;
    },
  },
};
</script>

<style>
</style>

UserInfo.vue

<template>
  <div class="userinfo">
    <h3>我是个人信息组件</h3>
    <!-- 1.3 子级用 -->
    <div>
      姓名:{{ username }}
      <button @click="changeNameFn">修改名称</button>
    </div>
    <div>年龄:{{ age }}</div>
    <div>是否单身:{{ isSingle ? "是" : "否" }}</div>
    <div>座驾:{{ car.brand }}</div>
    <div>兴趣爱好:{{ hobby.join("、") }}</div>
  </div>
</template>

<script>
export default {
  // props 组件上注册的一些自定义属性 → 向子组件传递数据用
  // 特点 1. 可以 传递 任意数量 的prop 2. 可以 传递 任意类型 的prop

  // 1. 拿到父级数据
  // 1.1 子级挖坑
  props: ["username", "age", "isSingle", "car", "hobby"],
  methods: {
    changeNameFn() {
      // 2. 修改父级数据
      // 2.1 给父级发通知
      this.$emit("changeName", "chl");
    },
  },
};
</script>

<style>
.userinfo {
  width: 300px;
  border: 3px solid #000;
  padding: 20px;
}
.userinfo > div {
  margin: 20px 10px;
}
</style>

2.4 props 校验

App.vue

<template>
  <!-- 05-src-props校验 -->
  <div id="app">
    <BaseProgress :w="width"></BaseProgress>
  </div>
</template>

<script>
import BaseProgress from "./components/BaseProgress.vue";
export default {
  data() {
    return {
      width: 40,
    };
  },
  components: {
    BaseProgress,
  },
};
</script>

<style>
</style>

BaseProgress.vue

<template>
  <div class="base-progress">
    <div class="inner" :style="{ width: w + '%' }">
      <span>{{ w }}%</span>
    </div>
  </div>
</template>

<script>
export default {
  // props: ['w'],

  // props校验
  // 为组件的 prop 指定验证要求,不符合要求,控制台就会有错误提示  → 帮助开发者,快速发现错误
  // props校验完整写法
  /* props: {
    校验的属性名: {
      // Number String Boolean ... (类型单词首字母大写)
      type: 类型,
      // default和required一般不同时写(因为当时必填项时,肯定是有值的)
      // 是否必填
      required: true,
      // 默认值
      // default后面如果是简单类型的值,可以直接写默认。如果是复杂类型的值,则需要以函数的形式return一个默认值
      default: 默认值,
      // 自定义校验逻辑: return 布尔值
      validator(value) {
        return 是否通过校验;
      },
    },
  }, */
  props: {
    w: {
      // 类型校验 可简写为 w: Number
      type: Number,
      // required: true,
      default: 0,
      validator(value) {
        if (value >= 0 && value <= 100) {
          console.log("满足规则");
          return true;
        } else {
          console.log("不满足规则");
          return false;
        }
      },
    },
  },
};
</script>

<style scoped>
.base-progress {
  height: 26px;
  width: 400px;
  border-radius: 15px;
  background-color: #272425;
  border: 3px solid #272425;
  box-sizing: border-box;
  margin-bottom: 30px;
}
.inner {
  position: relative;
  background: #379bff;
  border-radius: 15px;
  height: 25px;
  box-sizing: border-box;
  left: -3px;
  top: -2px;
}
.inner span {
  position: absolute;
  right: 0;
  top: 26px;
}
</style>

3. 综合案例 - 小黑记事本(组件版)

App.vue

持久化存储

<template>
  <!-- 07-src-小黑记事本 -->
  <!-- 主体区域 -->
  <section id="app">
    <!-- 输入框 -->
    <TodoHeader @addTodoList="handleAdd"></TodoHeader>
    <!-- 列表区域 -->
    <TodoMain :list="list" @delTodoList="handleDel"></TodoMain>
    <!-- 统计和清空 -->
    <TodoFooter :list="list" @clearList="handleClear"></TodoFooter>
  </section>
</template>

<script>
// * 大驼峰命名法(PascalCase)有助于区分组件和普通 HTML 元素,从而提高代码的可读性和一致性。
// * todoHeader × 创建组件时不遵循大驼峰命名 可能会出现错误 可更改(最好不要)
// 大驼峰命名法本身不会直接导致脚手架报错,
// 但不符合命名约定可能会引发 ESLint 警告、Vue DevTools 显示问题以及第三方库或插件的限制。
/* 
  vue.config.js 中更改组件命名规则
  module.exports = defineConfig({
    lintOnSave: true,
  });
*/
import TodoHeader from "./components/TodoHeader.vue";
import TodoMain from "./components/TodoMain.vue";
import TodoFooter from "./components/TodoFooter.vue";
export default {
  components: {
    TodoHeader,
    TodoMain,
    TodoFooter,
  },
  data() {
    return {
      list: JSON.parse(localStorage.getItem("todoList")) || [
        { id: 1, name: "吃饭" },
        { id: 2, name: "喝水" },
        { id: 3, name: "睡觉" },
      ],
    };
  },
  methods: {
    handleAdd(todo) {
      this.list.unshift({
        id: +new Date(),
        name: todo,
      });
    },
    handleDel(id) {
      this.list = this.list.filter((item) => item.id !== id);
    },
    handleClear() {
      this.list = [];
    },
  },
  watch: {
    // 复杂类型 → 深度监听
    list: {
      deep: true,
      handler(newList) {
        localStorage.setItem("todoList", JSON.stringify(newList));
      },
    },
  },
};
</script>

<style>
</style>

TodoHeader.vue

添加任务

<template>
  <header class="header">
    <h1>小黑记事本</h1>
    <!-- @keyup.enter="addTodo" 回车添加任务 -->
    <input
      placeholder="请输入任务"
      class="new-todo"
      v-model.trim="todo"
      @keyup.enter="addTodo"
    />
    <button class="add" @click="addTodo">添加任务</button>
  </header>
</template>

<script>
export default {
  data() {
    return {
      todo: "",
    };
  },
  methods: {
    addTodo() {
      if (this.todo === "") return alert("请输入有效内容");
      this.$emit("addTodoList", this.todo);
      this.todo = "";
    },
  },
  mounted() {
    // 打开页面 → 输入框获取焦点
    document.querySelector(".new-todo").focus();
  },
};
</script>

<style>
</style>

TodoMain.vue

渲染待办任务

删除任务

<template>
  <section class="main">
    <ul class="todo-list">
      <li class="todo" v-for="(item, index) in list" :key="item.id">
        <div class="view">
          <span class="index">{{ index + 1 }}.</span>
          <label>{{ item.name }}</label>
          <button class="destroy" @click="del(item.id)"></button>
        </div>
      </li>
    </ul>
  </section>
</template>

<script>
export default {
  props: {
    list: Array,
  },
  methods: {
    del(id) {
      this.$emit("delTodoList", id);
    },
  },
};
</script>

<style>
</style>

TodoFooter.vue

底部合计 和 清空功能

<template>
  <footer class="footer">
    <!-- 统计 -->
    <span class="todo-count"
      >合 计:<strong> {{ list.length }} </strong></span
    >
    <!-- 清空 -->
    <button class="clear-completed" @click="clear">清空任务</button>
  </footer>
</template>

<script>
export default {
  props: {
    list: Array,
  },
  methods: {
    clear() {
      this.$emit("clearList");
    },
  },
};
</script>

<style>
</style>

4. 非父子通信

4.1 event bus 事件总线

utils/EventBus.js

// 非父子通信 (拓展) - event bus 事件总线
// 作用:非父子组件之间,进行简易消息传递。(复杂场景 → Vuex)

// 1. 创建一个都能访问到的事件总线 (空 Vue 实例) → utils/EventBus.js
import Vue from "vue";
const Bus = new Vue();
export default Bus;

BaseB.vue

<template>
  <div class="base-b">
    B组件:发布方 <button @click="send">发送消息</button>
  </div>
</template>

<script>
import Bus from "../utils/EventBus";
export default {
  methods: {
    send() {
      // 2. B 组件(发送方),触发 Bus 实例的事件
      Bus.$emit("sendMsg", '368复机,密码"爱你一万年"');
    },
  },
};
</script>

<style scoped>
.base-b {
  width: 300px;
  height: 100px;
  border: 3px solid #000;
  border-radius: 3px;
  margin: 10px;
}
</style>

BaseA.vue

<template>
  <div class="base-a">
    A组件:接收方
    <h3>{{ title }}</h3>
  </div>
</template>

<script>
import Bus from "../utils/EventBus";
export default {
  data() {
    return {
      title: "",
    };
  },
  created() {
    // 3. A 组件(接收方),监听 Bus 实例的事件
    Bus.$on("sendMsg", (msg) => {
      this.title = msg;
    });
  },
};
</script>

<style scoped>
.base-a {
  width: 300px;
  height: 100px;
  border: 3px solid #000;
  border-radius: 3px;
  margin: 10px;
}
h3 {
  color: blueviolet;
}
</style>

4.2 provide & inject

App.vue

<template>
  <!-- 09-provide和inject -->
  <div class="app">
    我是APP组件
    <button @click="change">修改数据</button>
    <SonA></SonA>
    <SonB></SonB>
  </div>
</template>

<script>
// 非父子通信 (拓展) - provide & inject
// provide & inject 作用:跨层级共享数据。
import SonA from "./components/SonA.vue";
import SonB from "./components/SonB.vue";
export default {
  // 1. 父组件 provide 提供数据
  /* 
    注意
    - provide提供的简单类型的数据不是响应式的,复杂类型数据是响应式。(推荐提供复杂类型数据)
    - 子/孙组件通过inject获取的数据,不能在自身组件内修改
  */
  provide() {
    return {
      // 普通类型【非响应式】
      color: this.color,
      // 复杂类型【响应式】
      userInfo: this.userInfo,
    };
  },
  data() {
    return {
      color: "pink",
      userInfo: {
        name: "zs",
        age: 18,
      },
    };
  },
  methods: {
    change() {
      this.color = "blue";
      this.userInfo.name = "李四";
    },
  },
  components: {
    SonA,
    SonB,
  },
};
</script>

<style>
.app {
  border: 3px solid #000;
  border-radius: 6px;
  margin: 10px;
}
</style>

GrandSon.vue

<template>
  <div class="grandSon">
    我是GrandSon
    <p>{{ color }}</p>
    <p>{{ userInfo.name }}</p>
  </div>
</template>

<script>
export default {
  // 2. 子/孙组件 inject 取值使用
  inject: ["color", "userInfo"],
  created() {
    // console.log(this.color, this.userInfo);
  },
};
</script>

<style>
.grandSon {
  border: 3px solid #000;
  border-radius: 6px;
  margin: 10px;
  height: 100px;
}
</style>

5. 进阶语法

5.1 v-model 原理

<template>
  <!-- 10-v-model原理 -->
  <div id="app">
    <!-- v-model -->
    <input type="text" v-model="msg1" /> <br /><br />

    <!-- 
      原理:v-model本质上是一个语法糖。
      例如应用在输入框上,就是 value属性 和 input事件 的合写。
      作用:提供数据的双向绑定
        1. 数据变,视图跟着变 :value
        2. 视图变,数据跟着变 @input

      不同的表单元素,v-model 在底层的处理机制是不一样的。
      比如给 checkbox 使用 v-model 底层处理的是 checked 属性和 change 事件。

    -->
    <!-- change函数不能加() 加() → 有参数未传, 事件对象得不到数据 -->
    <input type="text" :value="msg2" @input="change" /> <br /><br />

    <!-- $event 用于在模板中,获取事件的形参
      提供的在template里面获取事件对象的参数 -->
    <input type="text" :value="msg3" @input="msg3 = $event.target.value" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg1: "",
      msg2: "",
      msg3: "",
    };
  },
  methods: {
    change(e) {
      this.msg2 = e.target.value;
    },
  },
};
</script>

<style>
</style>

5.2 表单类组件封装 & v-model 简化代码

App.vue

<template>
  <!-- 11-src-下拉封装 -->
  <div class="app">
    <BaseSelect :cityId="selectId" @changeId="handleChangeId"></BaseSelect>
  </div>
</template>

<script>
import BaseSelect from "./components/BaseSelect.vue";
export default {
  data() {
    return {
      selectId: "102",
    };
  },
  components: {
    BaseSelect,
  },
  methods: {
    handleChangeId(id) {
      this.selectId = id;
    },
  },
};
</script>

<style>
</style>

BaseSelect.vue

<template>
  <div>
    <!-- 
      表单类组件封装 & v-model 简化代码
      实现子组件和父组件数据的双向绑定 (实现App.vue中的selectId和子组件选中的数据进行双向绑定)
      
      下拉菜单 → value 和 change 事件的语法糖
      model 不能用 → 双向绑定,代表要修改数据 → cityId来自于父组件,子组件不能直接修改
     -->
    <select :value="cityId" @change="changeId">
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">广州</option>
      <option value="105">深圳</option>
    </select>
  </div>
</template>

<script>
export default {
  props: {
    cityId: String,
  },
  methods: {
    changeId(e) {
      // 通知父组件修改数据 → 当前下拉菜单的value值
      this.$emit("changeId", e.target.value);
    },
  },
};
</script>

<style>
</style>

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

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

相关文章

3D工具显微镜的测量范围

一、测量尺寸范围 样品尺寸&#xff1a; 3D工具显微镜通常能够测量各种尺寸和形状的样品&#xff0c;从小至微米级别的微小结构到大至几厘米甚至更大的物体。具体的测量尺寸范围取决于显微镜的载物台大小、镜头焦距以及软件处理能力。测量精度&#xff1a; 3D工具显微镜的测量…

C#—扩展方法

扩展方法 扩展方法是C#中一种特殊的静态方法&#xff0c;它定义在一个静态类中&#xff0c;但是可以像实例方法一样被调用&#xff0c;使得代码看起来更为直观和易于阅读。扩展方法允许你在不修改原始类的情况下&#xff0c;添加新的方法到现有的类型中。 有↓箭头的是扩展方…

vertx idea快速使用

目录 1.官网下载项目 2.修改代码 2.1拷贝代码方式 为了能够快速使用&#xff0c;我另外创建一个新的maven项目&#xff0c;将下载项目的src文件和pom文件拷贝到新建的maven项目。 2.2删除.mvn方式 3.更新配置 4.配置application 5.idea启动项目 1.官网下载项目 从vert…

分布式全文检索引擎ElasticSearch-数据的写入存储底层原理

一、数据写入的核心流程 当向 ES 索引写入数据时&#xff0c;整体流程如下&#xff1a; 1、客户端发送写入请求 客户端向 ES 集群的任意节点&#xff08;称为协调节点&#xff0c;Coordinating Node&#xff09;发送一个写入请求&#xff0c;比如 index&#xff08;插入或更…

android EditText密码自动填充适配

android上的密码&#xff08;其实不仅仅是密码&#xff0c;可以是用户名也可以是邮箱&#xff09;自动填充&#xff0c;是需要考虑适配的。 官方文档&#xff1a;https://developer.android.com/identity/autofill/autofill-optimize?hlzh-cn 什么是自动填充 手机厂商一般会…

【MySQL】非聚簇索引和聚簇索引,索引的创建、查询、删除

目录 存储引擎是MyISAM 非聚簇索引 主键索引&#xff1a; 普通(辅助)索引&#xff1a; 存储引擎是InnoDB 聚簇索引 主键索引&#xff1a; 普通(辅助)索引&#xff1a; 回表查询 创建索引 创建主键索引 主键索引的特点&#xff1a; 创建唯一索引 唯一索引的特点&am…

list的常用操作

list的介绍 list是序列容器&#xff0c;它允许在常数范围O&#xff08;1&#xff09;进行插入和删除在这段序列的任意位置&#xff0c;并且可以双向遍历 它是弥补vector容器的缺点&#xff0c;与vector有互补的韵味&#xff0c; 这里我们可以将其进行与vector进行对比 vect…

C# opencvsharp 流程化-脚本化-(2)ROI

ROI ROI也是经常需要使用的方法。特别是在图像编辑中。ROI又称感兴趣的区域&#xff0c;但是图像是矩阵是矩形的&#xff0c;感兴趣的是乱八七糟的&#xff0c;所以还有一个Mask需要了解一下的。 public class RoiStep : IImageProcessingStep{public ImageProcessingStepType…

极狐GitLab 正式发布安全补丁版本 17.6.2、17.5.4、 17.4.6

本分分享极狐GitLab 补丁版本 17.6.2, 17.5.4, 17.4.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码&#xff0c;我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS&#xff0c;技术团队已经进行了升级&#xff0c;无需用户采取任何…

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前&#xff0c;让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目&#xff0c;让我们创建一个名为node-ssl -server 的目录&#xff0c;用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…

CTFHub ssrf

第一关&#xff08;内网访问&#xff09; 尝试访问位于127.0.0.1的flag.php吧 第二关(伪协议读取文件) 尝试去读取一下Web目录下的flag.php吧 1.首先尝试http://127.0.0.1/flag.php 2.查看页面源代码 3.根据提示输入file:///var/www/html/flag.php 4.查看页面源代码 第三关&…

vue3+vite一个IP对站点名称的前端curd更新-会议系统优化

vue3-tailwind-todo https://github.com/kgrg/vue3-tailwind-todo 基于这个项目,把ip到sta的映射做了前端管理. 核心代码是存储和获得的接口,需要flask提供. def redis2ipdic():global ipdicipdic.clear()tmdiccl.hgetall(IPDIC_KEY)for k in tmdic.keys():ipdic[k.decode() …

idea无法识别文件,如何把floder文件恢复成model

前景&#xff1a; 昨天&#xff0c;我在之前的A1214模块包下新增了一个demo类&#xff0c;然后又新建了一个A1216模块&#xff0c;写了算法题&#xff0c;后面打算用git提交&#xff0c;发现之前的A1214模块下的demo类和新建的模块源文件都已经被追踪了&#xff0c;都是绿色的&…

如何调大unity软件的字体

一、解决的问题&#xff1a; unity软件的字体太小&#xff0c;怎么调大点&#xff1f;二、解决方法&#xff1a; 1.操作步骤&#xff1a; 打开Unity编辑器> Edit>preferences> UI Scaling>Use custom scaling value&#xff08;取消勾选“使用默认桌面设置”&…

冯诺依曼架构与哈佛架构的对比与应用

冯诺依曼架构&#xff08;Von Neumann Architecture&#xff09;&#xff0c;也称为 冯诺依曼模型&#xff0c;是由著名数学家和计算机科学家约翰冯诺依曼&#xff08;John von Neumann&#xff09;在1945年提出的。冯诺依曼架构为现代计算机奠定了基础&#xff0c;几乎所有现代…

实操给桌面机器人加上超拟人音色

前面我们讲了怎么用CSK6大模型开发板做一个桌面机器人充当AI语音助理&#xff0c;近期上线超拟人方案&#xff0c;不仅大模型语音最快可以1秒内回复&#xff0c;还可以让我们的桌面机器人使用超拟人音色、具备声纹识别等能力&#xff0c;本文以csk6大模型开发板为例实操怎么把超…

Fiddle突然抓不到虚拟机的地址

Fiddle不抓虚拟机的地址了 查看是否更换了ip地址,我是因为换了网络 更换正确的ip地址

Flutter组件————AppBar

AppBar 是 Flutter 中用于创建应用程序顶部栏的组件&#xff0c;它遵循 Material Design 规范。 参数&#xff1a; 参数名称类型描述titleWidget设置 AppBar 中的标题文本或自定义标题小部件。automaticallyImplyLeadingbool决定是否自动添加返回按钮&#xff08;如果页面不是…

【Java基础面试题025】什么是Java的Integer缓存池?

回答重点 Java的Integer缓存池&#xff08;Integer Cache&#xff09;是为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围&#xff0c;因此缓存这些对象可以减少内存分配和垃圾回收的负担&#xff0c;提升性能 在 -128到127范围内的Integer对象会…

【JavaEE初阶】线程 和 thread

本节⽬标 认识多线程 掌握多线程程序的编写 掌握多线程的状态 一. 认识线程&#xff08;Thread&#xff09; 1概念 1) 线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码. 还…