uni-app(6):Vue3语法基础下

1 列表渲染

1.1 在 v-for 里使用数组

        v-for 指令可以实现基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。

  • 在 v-for 块中,我们可以访问所有父作用域的 property
  • 第一个参数 item 则是被迭代的数组元素的别名。
  • 第二个参数,即当前项的索引 index ,是可选的。
<template><view><view v-for="(item, index) in items">{{ parentMessage }} - {{ index }} - {{ item.message }}</view></view></template><script>export default {data() {return {parentMessage: 'Parent',items: [{ message: 'Foo' },{ message: 'Bar' }]}}}</script>

1.2 在 v-for 里使用对象

        你也可以用 v-for 来遍历一个对象的 property

  • 第一个参数 value 是被迭代的对象元素的属性值。
  • 第二个参数为 property 名称 (也就是键名)。
  • 第三个参数作为索引。
<template><view><view v-for="(value, name, index) in object">{{ index }}. {{ name }}: {{ value }}</view></view></template><script>export default {data() {return {object: {title: 'How to do lists in Vue',author: 'Jane Doe',publishedAt: '2021-05-10'}}}}</script>

        在遍历对象时,会按 Object.keys() 的结果遍历,但是不能保证它在不同 JavaScript 引擎下的结果都一致。

1.3 列表渲染分组

        类似于 v-if,你也可以利用带有 v-for 的 template 来循环渲染一段包含多个元素的内容。比如:

<template v-for="item in items"><view>{{ item.message }}</view><view class="divider" role="presentation"></view></template>

1.4 维护状态

        当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

        这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute:

<view v-for="item in items" :key="item.id"><!-- content --></view>

        建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

  • 如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。
  • 而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除/销毁 key 不存在的元素。
  • 有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。

        不要使用对象或数组之类的非基本类型值作为 v-for 的 key。请用字符串或数值类型的值。如不提供 :key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

	<template><view><!-- array 中 item 的某个 property --><view v-for="(item,index) in objectArray" :key="item.id">{{index +':'+ item.name}}</view><!-- item 本身是一个唯一的字符串或者数字时,可以使用 item 本身 --><view v-for="(item,index) in stringArray" :key="item">{{index +':'+ item}}</view></view></template><script>export default {data () {return {objectArray:[{id:0,name:'li ming'},{id:1,name:'wang peng'}],stringArray:['a','b','c']}}}</script>

1.5 注意事项

        小程序端数据为差量更新方式,由于小程序不支持删除对象属性,使用的设置值为 null 的方式替代,导致遍历时可能出现不符合预期的情况,需要自行过滤一下值为 null 的数据

1.6 结合 <template v-for>

        在Vue3中,key 则应该被设置在 <template> 标签上

<template v-for="item in list" :key="item.id"><view>...</view><text>...</text></template>

        类似地,当使用 <template v-for> 时存在使用 v-if 的子节点,key 应改为设置在 <template> 标签上。

<template v-for="item in list" :key="item.id"><view v-if="item.isVisible">...</view><view v-else>...</view></template>

1.7 在组件上使用 v-for

        在自定义组件上,你可以像在任何普通元素上一样使用 v-for 。

<my-component v-for="item in items" :key="item.id"></my-component>

        当在组件上使用 v-for 时,key是必须的。

1.8 v-for 与 v-if 一同使用

        当它们处于同一节点,v-if 的优先级比 v-for 更高,这意味着 v-if 将没有权限访问 v-for 里的变量:

<!-- 这将引发错误,因为未在实例上定义属性“todo” --><view v-for="todo in todos" v-if="!todo.isComplete">{{ todo }}</view>

        可以把 v-for 移动到 template 标签中来修正:

<template v-for="todo in todos"><view v-if="!todo.isComplete">{{ todo }}</view></template>

2 事件处理

2.1 监听事件

        我们可以使用 v-on 指令 (通常缩写为 @ 符号,下文简称为:@事件) 来监听 DOM 事件,并在触发事件时执行一些 JavaScript。用法为 v-on:click="methodName" 或使用快捷方式 @click="methodName" (uni-app里一般都使用@缩写方式)指令的值,字符串里直接写js。比如下面的counter += 1就是一段js。

<template><view><button @click="counter += 1">Add 1</button><text>The button above has been clicked {{ counter }} times.</text></view></template><script>export default {data() {return {counter:0}}}</script>

2.2 事件处理方法

        然而许多事件处理逻辑会更为复杂,所以直接把 JavaScript 代码写在组件属性值里是不可行的。因此@事件还可以接收一个需要调用的方法名称。

<template><view><!-- `greet` 是在下面定义的方法名 --><button @click="greet">Greet</button></view></template><script>export default {data() {return {name: 'Vue.js'}},// 在 `methods` 对象中定义方法methods: {greet(event){// `event` 是原生 DOM 事件console.log(event);uni.showToast({title: 'Hello ' + this.name + '!'});}}}</script>

2.3 内联处理器中的方法

        除了直接绑定到一个方法,也可以在内联 JavaScript 语句中调用方法:

<template><view><button @click="say('hi')">Say hi</button><button @click="say('what')">Say what</button></view></template><script>export default {methods: {say(message) {uni.showToast({title: message});}}}</script>

        有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法:

<template><view><button @click="warn('Form cannot be submitted yet.', $event)">Submit</button></view></template><script>export default {methods: {warn(message, event) {// 现在我们可以访问原生事件对象if (event) {//可访问 event.target等原生事件对象console.log("event: ",event);}uni.showToast({title: message});}}}</script>

2.4 多事件处理器

        事件处理程序中可以有多个方法,这些方法由逗号运算符分隔:

	<template><view><!-- 这两个 one() 和 two() 将执行按钮点击事件 --><button @click="one($event); two($event)">Submit</button></view></template><script>export default {methods: {one(event) {// first handler logic...console.log("event1: ",event);},two(event) {// second handler logic...console.log("event2: ",event);}}}</script>

2.5 事件修饰符

        修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 @事件对于触发的事件调用 event.preventDefault()。@事件(v-on)提供了事件修饰符:

  • .stop: 各平台均支持, 使用时会阻止事件冒泡,在非 H5 端同时也会阻止事件的默认行为
  • .prevent: 仅在 H5 平台支持
  • .capture: 仅在 H5 平台支持
  • .self: 仅在 H5 平台支持
  • .once: 仅在 H5 平台支持
  • .passive: 仅在 H5 平台支持
<!-- 阻止单击事件继续传播 --><view @click.stop="doThis"></view>

        使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 @click.prevent.self 会阻止所有的点击,而 @click.self.prevent 只会阻止对元素自身的点击。

  • 为兼容各端,事件需使用 @ 的方式绑定,请勿使用小程序端的 bind 和 catch 进行事件绑定;也不能在 JS 中使用event.preventDefault()event.stopPropagation()方法。
  • 若需要禁止蒙版下的页面滚动,可使用 @touchmove.stop.prevent="moveHandle"moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。
<view class="mask" @touchmove.stop.prevent="moveHandle"></view>
  • 按键修饰符:uni-app 运行在手机端,没有键盘事件,所以不支持按键修饰符。

        使用 v-on 或 @ 有几个好处

  1. 扫一眼 template 模板便能轻松定位在 JavaScript 代码里对应的方法。
  2. 因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦,更易于测试。
  3. 当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何清理它们。

2.6 事件映射表

// 事件映射表,左侧为 WEB 事件,右侧为 ``uni-app`` 对应事件{click: 'tap',touchstart: 'touchstart',touchmove: 'touchmove',touchcancel: 'touchcancel',touchend: 'touchend',tap: 'tap',longtap: 'longtap', //推荐使用longpress代替input: 'input',change: 'change',submit: 'submit',blur: 'blur',focus: 'focus',reset: 'reset',confirm: 'confirm',columnchange: 'columnchange',linechange: 'linechange',error: 'error',scrolltoupper: 'scrolltoupper',scrolltolower: 'scrolltolower',scroll: 'scroll'}

3 表单输入绑定

3.1 v-model

        你可以用 v-model 指令在表单 inputtextarea 及 select 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

        v-model 会忽略所有表单元素的 valuecheckedselected attribute 的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。

        在下面的示例中,输入框通过v-model绑定了message,用户在输入框里输入内容时,这个内容会实时赋值给message。当然在代码里为message赋值也会实时同步到界面上input里。这就是双向绑定。

<template><view><input v-model="message" placeholder="edit me"><text>Message is: {{ message }}</text></view></template><script>export default {data() {return {message:""}}}</script>

3.2 uni-app表单组件

  • H5 的 select 标签用 picker 组件进行代替
<template><view><picker @change="bindPickerChange" :value="index" :range="array"><view class="picker">当前选择:{{array[index]}}</view></picker></view></template><script>export default {data() {return {index: 0,array: ['A', 'B', 'C']}},methods: {bindPickerChange(e) {console.log(e)this.index = e.detail.value}}}</script>
  • 表单元素 radio 用 radio-group 组件进行代替
<template><view><radio-group class="radio-group" @change="radioChange"><label class="radio" v-for="(item, index) in items" :key="item.name"><radio :value="item.name" :checked="item.checked" /> {{item.value}}</label></radio-group></view></template><script>export default {data() {return {items: [{name: 'USA',value: '美国'},{name: 'CHN',value: '中国',checked: 'true'},{name: 'BRA',value: '巴西'},{name: 'JPN',value: '日本'},{name: 'ENG',value: '英国'},{name: 'TUR',value: '法国'}]}},methods: {radioChange(e) {console.log('radio发生change事件,携带value值为:', e.detail.value)}}}</script>

4 计算属性和侦听器

4.1 计算属性computed

        每一个计算属性都包含一个 getter 函数和一个 setter函数 ,默认是利用 getter 函数来读取。所有 getter 和 setter 函数的 this 上下文自动地绑定为 Vue 实例。

4.1.1 计算属性的 getter

        模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如,有一个嵌套数组对象:

data() {return {author: {name: 'John Doe',books: ['Vue 2 - Advanced Guide','Vue 3 - Basic Guide','Vue 4 - The Mystery']}}}

        我们想根据 author 是否已经有一些书来显示不同的消息,可以使用模板内的表达式

<view><view>Has published books:</view><view>{{ author.books.length > 0 ? 'Yes' : 'No' }}</view></view>

        此时,模板不再是简单的和声明性的。你必须先看一下它,然后才能意识到它执行的计算取决于 author.books。如果要在模板中多次包含此计算,则问题会变得更糟。所以,对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性

	<template><view><view>OHas published books:</view><view>{{ publishedBooksMessage }}</view></view></template><script>export default {data() {return {author: {name: 'John Doe',books: ['Vue 2 - Advanced Guide','Vue 3 - Basic Guide','Vue 4 - The Mystery']}}},computed: {// 计算属性的 getterpublishedBooksMessage() {// `this` points to the vm instancereturn this.author.books.length > 0 ? 'Yes' : 'No'}}}</script>

        这里声明了一个计算属性 publishedBooksMessage。尝试更改应用程序 data 中 books 数组的值,你将看到 publishedBooksMessage 如何相应地更改。

        你可以像普通属性一样将数据绑定到模板中的计算属性。Vue 知道 publishedBookMessage 依赖于 author.books,因此当 author.books 发生改变时,所有依赖 publishedBookMessage 绑定也会更新。而且最妙的是我们已经声明的方式创建了这个依赖关系:计算属性的 getter 函数没有副作用,这使得更易于测试和理解。

        计算属性还可以依赖多个 Vue 实例的数据,只要其中任一数据变化,计算属性就会重新执行,视图也会更新。

4.1.2 计算属性的 setter

        计算属性默认只有 getter,不过在需要时你也可以提供一个 setter, 当手动修改计算属性的值时,就会触发 setter 函数,执行一些自定义的操作。

<template><view><view>{{ fullName }}</view></view></template><script>export default {data() {return {firstName: 'Foo',lastName: 'Bar'}},computed: {fullName: {// getterget(){return this.firstName + ' ' + this.lastName},// setterset(newValue){var names = newValue.split(' ')this.firstName = names[0]this.lastName = names[names.length - 1]}}}}</script>

        现在再运行 fullName = 'John Doe' 时,setter 会被调用,firstName 和 lastName 也会相应地被更新。

        getter与setter区别

  • get:通过设置get方法可以得到fullName的新值。
  • set:通过set的方法,设置一个值(newValue)来改变fullName相关联的值,引起fullName重新的计算,相应的页面上fullName也会发生改变成新的内容。

4.2 计算属性缓存 vs 方法

        我们可以通过在表达式中调用方法来达到同样的效果:

<template><view><view>{{ calculateBooksMessage() }}</view></view></template><script>export default {data() {return {author: {name: 'John Doe',books: ['Vue 2 - Advanced Guide','Vue 3 - Basic Guide','Vue 4 - The Mystery']}}},methods: {calculateBooksMessage() {return this.author.books.length > 0 ? 'Yes' : 'No'}}}</script>

        我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的反应依赖关系缓存的

        计算属性只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 author.books 还没有发生改变,多次访问 publishedBookMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。这也同样意味着下面的计算属性将不再更新,因为 Date.now () 不是响应式依赖:

computed: {now(){return Date.now()}}

        相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。我们为什么需要缓存?

        假设我们有一个性能开销比较大的计算属性 list,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 list。如果没有缓存,我们将不可避免的多次执行 list 的 getter!如果你不希望有缓存,请用 method 来替代。

4.3 侦听器watch

        虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

        当你有一些数据需要随着其它数据变动而变动时,就可以使用Watch来监听他们之间的变化。一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。 Vue 实例将会在实例化时调用 $watch() ,遍历 watch 对象的每一个 property 。

4.3.1 监听变量的值变化

<template><view><input type="number" v-model="a" style="border: red solid 1px;" /><input type="number" v-model="b" style="border: red solid 1px;" /><view>总和:{{sum}}</view><button type="default" @click="add">求和</button></view></template><script>export default {data() {return {a:1,b:1,sum: ""}},watch: {//使用watch来响应数据的变化,第一个参数为newVal新值,第二个参数oldVal为旧值a: function(newVal, oldVal) {console.log("a--newVal: ", newVal, "a--oldVal: ",oldVal);},b: function(newVal, oldVal) {console.log("b--newVal: ", newVal, "b--oldVal: ",oldVal);}},methods: {add() {this.sum = parseInt(this.a) + parseInt(this.b)}}}</script>

        以上示例有个问题,就是页面刚加载时,因为没有变化,所以不会执行。下面用immediate来解决。

4.3.2 选项:immediate

        在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调:watch方法默认就是handler,而当immediate:true时,就会先执行handler方法。

<template><view><input type="number" v-model="a" style="border: red solid 1px;" /><input type="number" v-model="b" style="border: red solid 1px;" /><view>总和:{{sum}}</view><button type="default" @click="add">求和</button></view></template><script>export default {data() {return {a:1,b:1,sum: ""}},watch: {a: {handler(newVal, oldVal) {console.log("a------: ", newVal, oldVal);},immediate: true//初始化绑定时就会执行handler方法},b: {handler(newVal, oldVal) {console.log("b------: ", newVal, oldVal);},immediate: true//初始化绑定时就会执行handler方法}},methods: {add() {this.sum = parseInt(this.a) + parseInt(this.b)}}}</script>

4.3.3 选项:deep

        为了发现对象内部值的变化,可以在选项参数中指定 deep: true 。深度监听一个对象整体的变化(即监听对象所有属性值的变化),注意监听数组的变更不需要这么做。

<template><view><input type="number" v-model="obj.a" style="border: red solid 1px;" /><input type="number" v-model="obj.b" style="border: red solid 1px;" /><view>总和:{{sum}}</view><button type="default" @click="add">求和</button></view></template><script>export default {data() {return {obj: {a: 1,b: 1,},sum:""}},watch: {obj: {handler(newVal, oldVal) {console.log('obj-newVal:' + JSON.stringify(newVal), 'obj-oldVal:' + JSON.stringify(oldVal), );},deep: true//对象中任一属性值发生变化,都会触发handler方法}},methods: {add() {this.sum = parseInt(this.obj.a) + parseInt(this.obj.b)}}}</script>

4.3.4 监听对象中单个属性

        如果不想监听 obj 中其他值,只想监听 obj.a 的值的变化,可以写成字符串形式监听。

export default {data() {return {obj: {a: 1,b: 1,}}},watch: {"obj.a": {//监听obj对象中的单个属性值的变化handler(newVal, oldVal) {console.log('obj-newVal:' + newVal, 'obj-oldVal:' + oldVal);}}}}

4.4 计算属性 vs 侦听属性

   Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch 。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。

export default {data() {return {firstName: 'Foo',lastName: 'Bar',fullName: 'Foo Bar'}},watch: {firstName: function(val) {this.fullName = val + ' ' + this.lastName},lastName: function(val) {this.fullName = this.firstName + ' ' + val}}}

        上面代码是命令式且重复的。将它与计算属性的版本进行比较:

export default {data() {return {firstName: 'Foo',lastName: 'Bar'}},computed: {fullName(){return this.firstName + ' ' + this.lastName}}}

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

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

相关文章

STM32之SPI——外部FLASH和RFID

一、SPI协议的原理与应用 基本概念 串行外设接口SPI&#xff08;Serial Peripheral Interface&#xff09;是由美国摩托罗拉公司最先推出的一种同步串行传输规范&#xff0c;也是一种单片机外设芯片串行外设扩展接口。该接口是一种高速、全双工、同步的通信总线&#xff0c;并…

51c视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13954440 #SceneTracker 在4D时空中追踪万物&#xff01;国防科大提出首个长时场景流估计方法 本篇分享 TPAMI 2025 论文​​SceneTracker: Long-term Scene Flow Estimation Network​​&#xff0c;国防科大提出首…

cf2059B

原题链接&#xff1a;https://codeforces.com/contest/2059/problem/B 题目背景&#xff1a; 将一个长度为 n 的数组 a 划分为 k 个数组&#xff0c;再将所有偶数索引的数组合并成 b 数组&#xff0c;定义代价为 的最小索引 i &#xff0c;可得到的最小代价为多少。 思路&am…

爬虫到智能数据分析:Bright Data × Kimi 智能洞察亚马逊电商产品销售潜力

前言 电商数据分析在现代商业中具有重要的战略价值&#xff0c;通过对消费者行为、销售趋势、商品价格、库存等数据的深入分析&#xff0c;企业能够获得对市场动态的精准洞察&#xff0c;优化运营决策&#xff0c;预测市场趋势、优化广告投放、提升供应链效率&#xff0c;并通…

从解决一个分享图片生成的历史bug出发,详解LayoutInflater和View.post的工作原理

问题背景 最近在项目中遇到一个问题&#xff1a;在档口分享功能中&#xff0c;需要动态生成一个分享图片。代码是这样写的&#xff1a; // 项目中的代码 val shareView LayoutInflater.from(thisStallMainActivityV1).inflate(R.layout.share_header_stall_main_layout, nul…

2.linux目录切换命令:cd与pwd以及路径与路径符

cd 切换当前工作目录 cd [linux路径0] cd没有选项,直接执行,只有参数.如果没有参数,表示回到用户的home目录 pwd 无参,无选项,直接打印当前工作目录的绝对路径 路径 相对路径 以当前目录为起点,路径描述无需使用/开头 # cd Desktop 绝对路径 路径描述需要以/开头 cd…

摩尔条纹 原理以及matlab 实现

一、简介 莫尔条纹的形成原理-CSDN博客 “莫尔”一词源于法文“Moire”&#xff0c;其原本的含义是“波动”或者“起波纹的”。早在古代时期&#xff0c;人们便偶然发现&#xff0c;当把两块薄的丝绸织物相互叠加放置时&#xff0c;能够看到一种呈现不规则形态的花纹。此后&a…

【海康USB相机被HALCON助手连接过后,MVS显示无法连接故障。】

在Halcon里使用助手调用海康USB相机时&#xff0c;如果这个界面点击了【是】 那么恭喜你&#xff0c;相机只能被HALCON调用使用&#xff0c;使用MVS或者海康开发库&#xff0c;将查找不到相机 解决方式&#xff1a; 右键桌面【此电脑】图标 ->选择【管理】 ->选择【设备…

数据治理是什么意思?数据治理平台有哪些?

目录 一、数据治理的概念 1. 数据治理的定义 2. 数据治理的目标 二、数据治理的实施流程 1. 规划阶段 2. 评估阶段 3. 执行阶段 4. 监控与评估阶段 三、常见的数据治理平台 1. FineDataLink 2. IBM InfoSphere Information Governance Catalog 四、总结 随着企业业…

高效工具-tldr

喜欢使用命令操作的小伙伴&#xff0c;肯定会遇到一个问题&#xff0c;查看命令如何使用时&#xff0c;会列出一堆&#xff0c;特别是英文&#xff0c;看的直发懵。前段时间我也是研究git命令&#xff0c;也遇到了类似的问题。好在有大数据&#xff0c;帮我普及相关的知识。 在…

安卓添加设备节点权限和selinux访问权限

# 1 修改设备节点权限及配置属性设置节点值 ## 1.1 修改设备节点权限 ### 1.1.1 不会手动卸载的节点 在system/core/rootdir/init.rc中添加节点权限 在on boot下面添加 chown system system /sys/kernel/usb/host chmod 0664 /sys/kernel/usb/host ### 1.1.2 支持热插拔的…

ssm学习笔记(尚硅谷) day1

创建新项目 maven的聚合 1. 标记父类项目 标签<packaging>pom</packaging>表示将该项目标记为父类项目&#xff0c;必须添加。 以下是标签<packing>的常见取值 groupId在pom.xml中&#xff0c;可以从pom.xml直接修改。 2. 通过<modules>添加子项目…

基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计

摘要 随着医疗信息化的不断推进以及“互联网医疗”模式的广泛普及&#xff0c;传统医院挂号流程中存在的排队时间长、资源分配不均等问题日益凸显&#xff0c;急需通过数字化手段加以解决。本研究设计并实现了一套基于Java、SpringBoot、Vue与UniAPP技术栈的医院预约挂号微信小…

Axure项目实战:运输统计页引入echarts实现高保真设计(JS代码ctrl+c ctrl+v懂得来)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 案例视频: 数据统计引入echarts示例演示 课程主题:运输统计页引入echarts实现高保真设计 主要内容…

python打卡day39

图像数据与显存 知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容即可 在 PyTorch 中&#xff0c;…

15.1 【基础项目】使用 HTML、CSS 和 TypeScript 构建的简单计数器应用

一个简单的计数器应用是学习如何集成 HTML、CSS 和 TypeScript 的绝佳项目。该应用允许用户对计数值进行增加、减少和重置&#xff0c;展示了 TypeScript 中基本的 DOM 操作和事件处理。 我们将构建的内容 我们将创建一个具有以下功能的计数器应用&#xff1a; 增加计数值减…

RT-Thread源码阅读(3)——内核对象管理

_object_container对象容器数组 在RT-Thread操作系统中&#xff0c;_object_container数组的作用是按类型分类管理内核对象&#xff0c;提供高效的类型检查、资源管理和统计功能 struct rt_list_node {struct rt_list_node *next; /**< point to…

《智能医学》征稿通知:7天可见刊,专科及以上可发表

香港科学出版社(Hong Kong Scientific Publishers Journals)是一家全球独立高质量的学术出版机构&#xff0c;遵循国际开放获取的出版(OA)原则。现已与科检易学术携手共同征集高质量文章。目前可出版来自高等学校、科研院所和企业的先进科技成果。包括理、工、农、医、经、管、…

如何利用categraf的exec插件实现对Linux主机系统用户及密码有效期进行监控及告警?

需求描述 Categraf作为夜莺监控平台的数据采集工具&#xff0c;为了保障Linux主机的安全&#xff0c;需要实现对系统用户密码有效期的监控&#xff0c;并在密码即将到期时及时告警&#xff0c;以提醒运维人员更改密码。本章将详细介绍如何利用Categraf的exec插件来实现这一功能…