vue3开发中易遗漏的常见知识点

深度解析Vue3! 利用let和const定义一组数据,这虽然不是严格意义上的响应式数据,但也可以通过setup函数返回它,他的值可以在模板中被插值表达式渲染出来。使用箭头函数定义一个函数,当它被调用时会在控制台输出相应信息。箭头函数:是ES6中引入的一种新的函数语法,提供了一种更加简洁、灵活、强大的函数表达式,可以简化代码,提高代码的可读性,并带来独特的特性。定义一个sum的箭头函数,接收两个参数a和b,返回他们的和。 阅读详情

组件样式的特性

Scoped CSS之局部样式的泄露

示例(vue3):

父组件:

<template>
  <h4>App Title</h4>
  <hello-world></hello-world>
</template>
<script>
import HelloWorld from './HelloWorld.vue';

export default {
  name: 'App',
  components: {
    HelloWorld
  }
};
</script>
<style scoped>
h4 {
  text-decoration: underline;
}
</style>

HelloWorld子组件:

<template>
  <h4>Hello World1</h4>
</template>
<script>
export default {
  name: 'HelloWorld'
}
</script>
<style scoped></style>

结果如图所示:

在这里插入图片描述

结论:子组件的根节点会同时受到父组件的作用域样式和子组件的作用域样式的影响。

为了避免这种局部样式泄露的问题,可以采用如下方式:

  • 1.尽量减少标签选择器的使用,多使用class选择器。
  • 2.在每个子组件的根元素中添加唯一的class选择器。
  • 3.在子组件中使用多个根元素,也可以在template中添加多个根元素,Vue.js 3已经支持这种方式

上面HelloWorld子组件调整下代码如下:

<template>
  <div class="hello-world">
    <h4>Hello World1</h4>
  </div>
</template>
<script>
export default {
  name: 'HelloWorld'
}
</script>
<style scoped></style>

结果如图所示:

在这里插入图片描述

这样父组件h4的样式就不会影响子组件的h4标签样式。

Scoped CSS之深度选择器

有时候需要在父组件的局部样式中修改子组件的某个元素的样式,这时可以使用深度选择器:deep()这个伪类实现。

我们在HelloWorld.vue组件中添加一个class为msg的元素,示例代码如下:

<template>
  <div class="hello-world">
    <h4 class="msg">Hello World1</h4>
  </div>
</template>
<script>
export default {
  name: 'HelloWorld'
}
</script>
<style scoped></style>

在父组件中添加如下样式:

<template>
  <h4>App Title</h4>
  <hello-world></hello-world>
</template>
<script>
import HelloWorld from './HelloWorld.vue';

export default {
  name: 'App',
  components: {
    HelloWorld
  }
};
</script>
<style scoped>
h4 {
  text-decoration: underline;
}

/* 深度选择器:选中子组件class为msg的元素  */
:deep(.msg) {
  text-decoration: underline;
}
</style>

结果如图所示:

在这里插入图片描述

CSS Modules

当组件的<style>标签中带有module属性时,标签会被编译为CSS Modules,并将生成的CSS类作为$style对象的键暴露给组件。

<template>
  <div class="hello-world">
    <p :class="$style.red">This should be red</p>
  </div>
</template>
<script>
export default {
  name: 'HelloWorld'
}
</script>
<style module>
/* red CSS 类会作为$style对象的键,即$style.red */
.red {
  color: red;
}
</style>

CSS Modules 这种方式在vue3项目中用得比较少。

在CSS中使用v-bind

在vue.js 3.2版本之前,v-bind语法是一个实验性的功能,在vuejs 3.2版本之后,v-bind功能已经稳定。

示例如下:

<template>
  <div class="example">
    <h4 class="red">hello should be red</h4>
    <h4 class="green">hello should be green</h4>
    <h4 class="yellow">hello should be yellow</h4>
  </div>
</template>
<script>
export default {
  name: 'example',
  data () {
    return {
      color1: 'red',
      color2: 'green'
    }
  },
  computed: {
    color3 () {
      return 'yellow'
    }
  }
}
</script>
<style>
/* 动态绑定样式,也属于局部样式。与style标签是否绑定 scoped 属性没有关系 */
.red {
  color: v-bind(color1)
}

.green {
  color: v-bind(color2)
}

.yellow {
  color: v-bind(color3)
}
</style>

页面渲染结果如图:

在这里插入图片描述

DOM渲染截图:

在这里插入图片描述

实际上,他们的值会被编译成hash的CSS自定义property,CSS本身仍然是静态的。自定义property会通过内联样式的方式应用到组件的根元素上,如上截图所示,并且在源值变更时响应式更新。和前面的属性一样,它的CSS只会应用到当前组件的元素上。

非props属性继承

例如像id,name,class这样没有定义的props属性,在组件中没有通过props传递,但是这对应的属性也继承到了子组件的根元素上,示例代码:

父组件:

<template>
  <no-prop-attribute id="coder" class="why" name="codername"></no-prop-attribute>
</template>
<script>
import NoPropAttribute from './NoPropAttribute.vue';

export default {
  name: 'App',
  components: {
    NoPropAttribute
  }
};
</script>
<style scoped></style>

子组件:

<template>
  <div class="no-prop-attribute">
    该子组件没有定义任何的props属性
  </div>
</template>
<script>
export default {
  name: 'NoPropAttribute'
}
</script>

结果渲染如图所示:

在这里插入图片描述

如果不希望组件的根元素继承属性,那么在组件中设置inheritAttrs: false即可。

调整子组件代码:

<template>
  <div class="no-prop-attribute">
    该子组件没有定义任何的props属性
  </div>
</template>
<script>
export default {
  name: 'NoPropAttribute',
  inheritAttrs: false
}
</script>

渲染结果如图所示:

在这里插入图片描述

我们可以在子组件中通过$attr访问所有非props的属性,子组件示例代码如下:

<template>
  <div class="no-prop-attribute">
    该子组件没有定义任何的props属性
    <h4 :class="$attrs.class" :id="$attrs.id">{{ $attrs.name }}</h4>
  </div>
</template>
<script>
export default {
  name: 'NoPropAttribute',
  inheritAttrs: false
}
</script>

渲染结果如图所示:

在这里插入图片描述

组件通信

父子组件的相互通信props/$emit

父组件传递数据给子组件

略

子组件传递数据给父组件

自定义事件参数与自定义事件验证示例。

父组件:

<template>
  <div>
    <h4>当前计数:{{ counter }}</h4>
    <counter-operation @add="addOne" @sub="subOne" @addN="addNNum"></counter-operation>
  </div>
</template>

<script>
import CounterOperation from './CounterOperation.vue';
export default {
  components: {
    CounterOperation
  },
  data () {
    return {
      counter: 0
    }
  },
  methods: {
    addOne () {
      this.counter++;
    },
    subOne () {
      this.counter--;
    },
    addNNum (num, name, age) {
      console.log(name, age);
      this.counter += num;
    }
  }
}

</script>

子组件CounterOperation.vue:

<template>
  <div>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
    <input type="text" v-model.number="num">
    <button @click="incrementN">+n</button>
  </div>
</template>

<script>
export default {
  // 1.数组写法
  // emits: ['add', 'sub', 'addN'],
  // 2.对象写法
  emits: {
    add: null,
    sub: null,
    addN: (num, name, age) => {
      if (num > 10) {
        // 如果num大于10,则验证通过
        return true;
      }
      // 如果num小于10,则返回false,控制台会出现参数验证不通过的警告,但是不影响程序的运行。
      return false;
    }
  },
  data () {
    return {
      num: 0
    }
  },
  methods: {
    increment () {
      this.$emit('add');
    },
    decrement () {
      this.$emit('sub');
    },
    incrementN () {
      this.$emit('addN', this.num, "why", 18);
    }
  }
}

</script>

非父子组件的相互通信

Provide/inject

如下示例,
新建三个vue文件,App.vue(根组件)、Home.vue(子组件)、HomeContent.vue(孙子组件)。

HomeContent.vue组件:

<!-- 孙子组件 -->
<template>
  <div class="home-content">
    home-content
    <p>{{ name }} - {{ age }} - {{ friends }}</p>
  </div>
</template>
<script>
export default {
  inject: ['name', 'age', 'friends']
}
</script>

Home.vue:

<!-- 子组件 -->
<template>
  <div class="home">
    home
    <home-content></home-content>
  </div>
</template>
<script>
import HomeContent from './HomeContent.vue'; // 子组件中导入孙子组件
export default {
  name: 'Home',
  components: {
    HomeContent
  }
}
</script>

App.vue:

<!-- 根组件 -->
<template>
  <div id="app">
    App
    <home></home>
    <button @click="addFriend">新增朋友</button>
  </div>
</template>
<script>
import Home from './Home.vue';
export default {
  name: 'App',
  components: {
    Home
  },
  provide () {
    return {
      name: 'why',
      age: 20,
      friends: this.friends
    }
  },
  data () {
    return {
      friends: ["jerry", "tom"]
    }
  },
  methods: {
    addFriend () {
      this.friends.push("jack");
      console.log(this.friends);
    }
  }
}
</script>

运行结果:

在这里插入图片描述

当我们点击“新增朋友”,视图效果:

在这里插入图片描述

从图上可以知道提供的friends属性是响应式的数据。

如果我们在孙子组件中获取friends的长度,孙子组件跟根组件代码。

孙子组件HomeContent.vue:

<!-- 孙子组件 -->
<template>
  <div class="home-content">
    home-content
    <p>{{ name }} - {{ age }} - {{ friends }} - {{ friendLength }}</p>
  </div>
</template>
<script>
export default {
  inject: ['name', 'age', 'friends', "friendLength"]
}
</script>

根组件App.vue:

<!-- 根组件 -->
<template>
  <div id="app">
    App
    <home></home>
    <button @click="addFriend">新增朋友</button>
  </div>
</template>
<script>
import Home from './Home.vue';
export default {
  name: 'App',
  components: {
    Home
  },
  provide () {
    return {
      name: 'why',
      age: 20,
      friends: this.friends,
      friendLength: this.friends.length
    }
  },
  data () {
    return {
      friends: ["jerry", "tom"]
    }
  },
  methods: {
    addFriend () {
      this.friends.push("jack");
      console.log(this.friends);
    }
  }
}
</script>

初始渲染结果如图:

在这里插入图片描述

当我们点击了“新增朋友”,渲染结果如图:

在这里插入图片描述

从图上可以知道,当我们修改了friends后,孙子组件中注入的friendLength属性并未随之改变。这是因为修改了friends之后,之前在provide中映入的this.friends.length属性本身并不是响应式数据。

如果想要响应式数据,我们使用vuejs 3提供的computed API,修改App.vue组件,让friendLength属性接收一个计算属性,代码如下调整:

<!-- 根组件 -->
<template>
  <div id="app">
    App
    <home></home>
    <button @click="addFriend">新增朋友</button>
  </div>
</template>
<script>
import { computed } from 'vue';
import Home from './Home.vue';
export default {
  name: 'App',
  components: {
    Home
  },
  provide () {
    return {
      name: 'why',
      age: 20,
      friends: this.friends,
      friendLength: computed(() => this.friends.length)
    }
  },
  data () {
    return {
      friends: ["jerry", "tom"]
    }
  },
  methods: {
    addFriend () {
      this.friends.push("jack");
      console.log(this.friends);
    }
  }
}
</script>

最终效果如图,当我们点击了“新增朋友”,对应的长度也变化了:

在这里插入图片描述

全局事件总线

事件总线(mitt)是对发布/订阅模式的一种实现,它是一种集中式事件处理机制,允许 vue.js 3 应用程序中的不同组件之间相互通信,无需相互依赖,就可以达到解耦的目的。

在vue.js 3中,可以使用事件总线作为组件之间传递数据的桥梁。所有组件都可以共用同一个事件中心,从而向其他任意组件发送或者接收事件,实现上下同步通知。

Vue.js 3中移除了实例中的on、off、$once方法。如果需要继续使用全局事件总线,则官方推荐第三方库来实现,如mitt或tiny-emitter。

这儿以mitt为例。

首先,安装mitt,执行如下命令:

npm i mitt -S

其次,可以封装一个工具eventbus.js,用于同一导出emitter对象,代码如下所示:

import mitt from 'mitt';

// 1.创建emitter对象
const emitter = mitt();

// 2.也可以创建多个emitter对象
const emitter2 = mitt();

export default emitter;

emitter对象常用的API如下:

  • 1.发送(或触发)事件的API
// 参数1:事件名称(string|symbol类型)
// 参数2:发送事件时传递的数据(any类型,推荐对象)
emitter.emit('why',{name: 'why',age: 18});
  • 2.监听事件的API。注意:监听的事件名需要和触发的事件名一致
// 这里监听全局的why事件
// 参数1:事件名称
// 参数2:监听事件的回调函数,data是触发事件时传递过来的参数
emitter.on('why', (data) => {
  console.log("why:", data);
});
  • 3.如果在某些情况下需要取消事件,那么可以使用下面的API
    • 3.1 取消emitter中所有的监听
      emitter.all.clear();
    
    • 3.2 取消某一个事件,但需要先定义一个函数
      function onFoo() {}
      emitter.on('foo', onFoo)   // listen
      emitter.off('foo', onFoo)  // unlisten
    

使用示例

实现如下图所示的跨组件的通信。

在这里插入图片描述

我们分别新建App.vue、Home.vue、HomeContent.vue和About.vue组件以及utils/eventbus.js文件。

utils/eventbus.js文件,用于封装事件总线工具,代码如下:

import mitt from 'mitt';

// 创建emitter对象
const emitter = mitt();

export default emitter;

About.vue组件,负责发送全局事件,代码如下:

<!-- About.vue 子组件 -->
<template>
  <div class="about">
    About
    <button @click="btnClick">单击按钮 触发事件</button>
  </div>
</template>
<script>
import emitter from './utils/eventbus';
export default {
  name: 'About',
  methods: {
    btnClick () {
      console.log('1. About页面的:单击按钮-》触发全局why事件');
      emitter.emit('why', { name: 'why', age: 20 });

      console.log('2. About页面的:单击按钮-》触发全局kobe事件');
      emitter.emit('kobe', { name: 'kobe', age: 20 });
    }
  }
}
</script>

HomeContent.vue组件,负责监听全局的事件,代码如下:

<!-- HomeContent.vue 孙子组件 -->
<template>
  <div class="home-content">
    homeContent
  </div>
</template>
<script>
import emitter from './utils/eventbus';
export default {
  created () {
    // 监听全局的why事件
    emitter.on('why', (data) => {
      console.log('why:', data);
    });

    // 监听全局的kobe事件
    emitter.on('kobe', (data) => {
      console.log('kobe:', data);
    });

    // 监听all事件
    emitter.on('*', (type, data) => {
      console.log('* listener:', type, data);
    });
  }
}
</script>

Home.vue组件,负责导入HomeContent.vue组件,代码如下:

<!-- Home.vue 子组件 -->
<template>
  <div class="home">
    home
    <home-content></home-content>
  </div>
</template>
<script>
import HomeContent from './HomeContent.vue'; // 子组件中导入孙子组件
export default {
  name: 'Home',
  components: {
    HomeContent
  }
}
</script>

App.vue组件,负责导入、注册和使用Home.vue、About.vue组件,代码如下:

<!-- App.vue 根组件 -->
<template>
  <div id="app">
    App
    <home />
    <about />
  </div>
</template>
<script>
import Home from './Home.vue';
import About from './About.vue';
export default {
  name: 'App',
  components: {
    Home,
    About
  }
}
</script>

组件插槽

作用域插槽

示例代码,ShowNames.vue子组件,示例代码如下:

<template>
  <div class="show-names">
    <template v-for="(item, index) in names" :key="item">
      <slot :item="item" :index="index"></slot>
    </template>
  </div>
</template>
<script>
export default {
  props: {
    names: {
      type: Array,
      default: () => []
    }
  }
}
</script>

父组件App.vue,示例代码如下:

<!-- App.vue 根组件 -->
<template>
  <div id="app">
    <show-names :names="names">
      <template v-slot:default="slotProps">
        <span>{{ slotProps.item }} {{ slotProps.index }} - </span>
      </template>
    </show-names>
  </div>
</template>
<script>
import ShowNames from './ShowNames.vue';
export default {
  name: 'App',
  components: {
    ShowNames
  },
  data () {
    return {
      names: ['why', 'kobe', 'jeck', 'tom']
    }
  }
}
</script>

展示效果:

在这里插入图片描述

独占默认插槽

对于默认插槽(即name=“default”),在使用时可以将v-slot:default="slotProps"简写为v-slot="slotProps"
我们把上面父组件App.vue代码调整下修改下,如下所示:

<!-- App.vue 根组件 -->
<template>
  <div id="app">
    <show-names :names="names">
      <template v-slot="slotProps">
        <span>{{ slotProps.item }} {{ slotProps.index }} - </span>
      </template>
    </show-names>
  </div>
</template>

最终渲染结果跟上面是一样的。

在只有默认插槽时,组件的标签可以被当做插槽的模板(template)使用,这样就可以将v-slot直接用在组件上,即省略template元素,修改App.vue组件,将v-slot="slotProps"写到组件上,代码如下:

<!-- App.vue 根组件 -->
<template>
  <div id="app">
    <show-names :names="names" v-slot="slotProps">
      <span>{{ slotProps.item }} {{ slotProps.index }} - </span>
    </show-names>
  </div>
</template>

但是如果组件同时具备默认插槽和具名插槽,那么必须按照template的语法来编写。

动态组件

动态组件的实现与传参

实现原理就是通过内置的动态组件实现,即使用<component>组件,并通过其特殊属性is动态渲染不同的组件,这里的is属性用于指定组件的名称。

新建App.vue(父组件)、page/Home.vue(子组件)、page/About.vue(子组件)、page/Category.vue(子组件).

App.vue示例代码:

<template>
  <div>
    <button v-for="item in tabs" :key="item" @click="itemClick(item)" :class="{ active: item === currentTab }">
      {{ item }}
    </button>
    <component :is="currentTab" name="coder" :age="20" @pageClick="pageClick"></component>
  </div>
</template>
<script>
import Home from "./page/Home.vue";
import About from "./page/About.vue";
import Category from "./page/Category.vue";

export default {
  components: {
    Home,
    About,
    Category
  },
  data () {
    return {
      tabs: ['home', 'about', 'category'],
      currentTab: 'home'
    }
  },
  methods: {
    itemClick (item) {
      this.currentTab = item
    },
    pageClick (value) {
      console.log(value);
    }
  }
}

</script>
<style scoped>
.active {
  color: red;
}
</style>

page/Home.vue:

<template>
  <div @click="divClick">Home组件: {{ name }} - {{ age }}</div>
</template>
<script>
export default {
  name: 'home',
  props: {
    name: {
      type: String,
      default: ''
    },
    age: {
      type: Number,
      default: 0
    }
  },
  emits: ['pageClick'], // 该组件触发了pageClick事件
  methods: {
    divClick () {
      this.$emit('pageClick', 'Home组件触发了单击')
    }
  }
}
</script>

page/About.vue:

<template>
  <div @click="divClick">About组件: {{ name }} - {{ age }}</div>
</template>
<script>
export default {
  name: 'about',
  props: {
    name: {
      type: String,
      default: ''
    },
    age: {
      type: Number,
      default: 0
    }
  },
  emits: ['pageClick'], // 该组件触发了pageClick事件
  methods: {
    divClick () {
      this.$emit('pageClick', 'About组件触发了单击')
    }
  }
}
</script>

page/Category.vue:

<template>
  <div @click="divClick">Category组件: {{ name }} - {{ age }}</div>
</template>
<script>
export default {
  name: 'category',
  props: {
    name: {
      type: String,
      default: ''
    },
    age: {
      type: Number,
      default: 0
    }
  },
  emits: ['pageClick'], // 该组件触发了pageClick事件
  methods: {
    divClick () {
      this.$emit('pageClick', 'Category组件触发了单击')
    }
  }
}
</script>

实现效果:

在这里插入图片描述

如上面示例home组件的名称为字符串home,当currentTab为home字符串时,显示<home>组件。

如何在vue3.0中友好的使用antdv 如何在vue3.0中友好的使用antdv 随着我们vue3.0的出现,我们的ui组件库也有了一些变化,像我们的旧版的element-ui已经不能在vue3.0中使用了,如果要使用element的话需要使用最新版的element-plus,由于发现它并不太好用,因此我选择了Ant Design Vue。 如果我们以前经常使用antd的话,我们使用起来这个上手会非常方便。 在vue3.0中引入我们的antdv 1.首先使用我们的vue/cli创建vue3.0项目并使用less 2. 在vue3.0中使用的话 阅读详情

相关推荐

使用tsx开发vue项目入门

很久不写博客了,最近在使用ts和tsx开发vue类项目,网上资料比较少,顺便记录一下方便同样开发的人互相学习共同进步。 本篇文章尽量不遗漏重要环节,本着真正分享的心态,不做标题党 下面进入正题: 由于现在vue的官方脚手架已经非常完善我们就不单独配置webpack了,节省大量的时间成本。 首先使用@vue/cli创建一个vue模版项目(记得是@vue/cli不是vue-cli还不知道的人可...

keader01的博客 2万+

Vue3 _ 学习

​目录 Vue3 一、Vue3 初识 1、Vue3 简介 2、Vue3 特点: 3、创建 Vue3 工程项目 4、Vue3 目录结构分析 二、Composition API 1、setup 函数 2、setup 执行时间 三、ref 响应式函数 1、引言: 2、ref 函数 四、reactive 函数 五、Vue3 响应式原理 1、Vue2.x 的响应式原理 2、Vue3.0 响应式原理: 六、Vue3 中的组件传参 1、父传子 2、子传父 七、Vue3 中的计算属性

Mr.小灰狼_随笔 2626

Vue3 处理异步函数的完整指南,包含常见场景、问题及最佳实践

在 Vue3 中,异步操作是前端开发的核心需求之一,常用于数据获取、用户交互、定时任务等场景。以下是 Vue3 处理异步函数的完整指南,包含常见场景、问题及最佳实践。

繁若华尘的博客 1433

Vue 3 介绍

vue3基础

csdn727232616的博客 7万+

用ai 做前端网站,建议用vue3 还是Reactjs好?

例如,Vue 的单文件组件(SFC)结构(模板 + 脚本 + 样式)在开源项目中广泛使用,AI 模型可通过大量样本学习生成标准代码5。例如,PromptCoder 生成的提示词可直接转化为 Vue 的模板结构,而 React 的 JSX 需 AI 在生成时同时处理 JavaScript 表达式和组件嵌套,增加出错概率4。例如,当项目使用 Vue CLI 时,AI 可自动生成符合配置的路由和组件,而 React 项目可能需要额外处理 Webpack 或 Babel 配置,增加生成复杂度4。

weixin_42365134的博客 1520

STM32F103C8T6+HX711实战:从零打造智能体重秤(附OLED显示与语音播报)

本文详细介绍了基于STM32F103C8T6微控制器和HX711称重模块,从零构建智能体重秤的完整实战教程。内容涵盖硬件选型、系统架构、驱动编写、数据滤波校准算法,并实现了OLED显示与语音播报功能。该项目是嵌入式学习的综合性实践,尤其适合作为毕业设计课题,帮助开发者掌握传感器应用、数据处理及人机交互等核心技能。

weixin_28285943的博客 517

前端刺客系列----Vue 3 入门介绍

Vue.js 是一款渐进式的 JavaScript 框架,用于构建用户界面。它的设计理念非常灵活,可以逐步引入到项目中,适应不同规模的需求。Vue 3 是 Vue.js 框架的最新版本,它在 Vue 2 的基础上进行了全面的优化,带来了以下几大亮点:性能提升:Vue 3 引入了更高效的虚拟 DOM 和组件渲染机制,使得整体性能得到了显著提升。组合式 API (Composition API):这是一种全新的编写组件的方式,使得逻辑复用和代码组织变得更加灵活和清晰。

DK22151的博客 2万+

STM32G474 FDCAN滤波器配置与多ID接收实战

本文详细介绍了STM32G474 FDCAN滤波器配置与多ID接收实战,重点解析了掩码过滤和范围过滤两种模式的工作原理及配置步骤。通过实际项目案例展示了如何高效配置多个滤波器实现多ID报文接收,并提供了接收FIFO配置与中断处理的优化策略,帮助开发者提升CAN通信系统的稳定性和实时性。

happy2的博客 875

【前端开发---Vue3】前段开发之详细的Vue3入门教程,特别适合小白系统学习,入门到熟练使用Vue看这一篇就够了!

前段开发之详细的Vue3入门教程,特别适合小白系统学习,入门到熟练使用Vue看这一篇就够了!内容包括Vue3项目的创建,Vue2与Vue3的区别,路由,组件,各种组件之间的传值等;

m0_67844671的博客 2万+

使用DCA1000和EVM板进行数据采集

目录 1. 准备工作 1.1 硬件 1.2 软件 2. 驱动安装 3. 设置静态IP地址 4. 采集数据 5. 采集的数据文件的格式 6. 数据采集存储的数据流 参考资料 1. 准备工作 1.1 硬件 EVM板,电源线(5V,>2.5A),USB线 DCA1000,电源线(5V,>2A),USB线,网线,60pin Samtec cable 1.2 软件 mmWave Studio Matlab Runtime Engine v8.5.1 将DCA1000和EVM板

qq_42235129的博客 1万+

适合初学者的ROS机器人教程(1): Ubuntu下ROS创建自己的包和使用github下载的包

ROS如何创建自己的包 1. 首先创建catkin工作空间(如果你以及有了请忽略) $ mkdir catkin_ws # 创建一个文件夹里面计划放我们的项目,ws是workspace的缩写 $ cd catkin_ws # 将当前工作文件夹切换到catkin_ws这个文件夹 ~/catkin_ws$ catkin_make # 执行catkin_make创建一ROS项目 此时你的catkin_...

@司南牧|知乎|博客|易懂教程|李韬 3243

vue遗漏知识点

vue 相关知识点 1. $attrs和$listeners 二次封装组件 当我们对第三方组件进行二次封装,但是不想重写组件上原有的属性 可以使用 v-bind="$attrs" 例如 封装的第三方组件:<template><div><el-button v-bind="$attrs">确定</el-button></div></template> 使用封装的第三方组件: <my-button type="parmery"

qq_36001325的博客 169

自动驾驶领域自动化数据标注应用

自动驾驶领域自动化数据标注应用 1. 背景介绍 1.1 自动驾驶技术的发展 自动驾驶技术近年来取得了长足的进步,吸引了众多科技公司和传统车企的投入。自动驾驶系统需要感知周围环境、做出决策并控制车辆,是一个极具挑战的任务。其中,环境感知是自

AI天才研究院 2214

Vue.js 配置文件中遗漏必要字段的问题及解决方案

Vue.js 配置文件中的遗漏字段可能会导致项目构建失败或运行异常。通过检查并设置publicPathoutputDirdevServer或以及css配置,可以有效解决这些问题。希望本文的介绍能帮助你在 Vue.js 开发中更好地管理配置文件,提升项目的可维护性和稳定性。最后问候亲爱的朋友们,并邀请你们阅读我的全新著作📚《Vue.js 3企业级项目开发实战(微课视频版》

有我更精彩的博客 901

【libnice】meson + vs2022,生成win32工程

libnice

突围 947

到底什么是指令集?什么是微架构?他们是什么关系?

指令集、处理器架构、芯片厂商、ARM、x86,其间关系还在迷糊吗?一文迅速理清!!

车载系统攻城狮 7811

Vue3教程:Vue3.0 + Vant3.0 搭建种子项目

最近在用 Vue3 写一个开源的商城项目,开源后让大家也可以用现成的 Vue3 大型商城项目源码来练练手,目前处于开发阶段,过程中用到了 Vant3.0,于是就整理了这篇文章来讲一下如何...

程序员有故事 2730

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

Vue3 + TypeScript 常见类型错误速查清单

本文总结了Vue3+TypeScript开发中8个最高频的类型错误,包括Ref取值未加.value、Props可选属性未判空、滥用any类型、DOM Ref未判空、Emits参数类型不匹配等常见问题。针对每个错误场景,提供了典型报错示例、原因分析和解决方案,帮助开发者快速定位和解决问题。文章强调遵循TypeScript严格模式,避免使用any类型,推荐使用可选链、接口定义等最佳实践,确保类型安全和开发效率。适合Vue3+TS开发者参考,可作为日常开发中的排错指南。

hunter 422

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

vue2升级vue3方案

升级前 模版 元素中 v-model.sync 改为 v-model:value; 排查同时使用 v-if 和 v-for 的元素,避免在同一个元素上同时使用,可以通过 computed 方式过滤出可见元素的列表; 排查元素 v-bind 的前后使用,确保 v-bind 先定义,再定义各个属性; 排查 v-for 中使用 ref 的地方,将 ref 绑定为一个更灵活的函数上; 组件 升级中 模版 对于没有修饰符的 v-model,分别将 prop 和 event 命名更改为 modelValue

majing0520的博客 4356

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

idea环境下vue2升级vue3

我们还将讨论Vue3的新特性,如Composition API和Teleport等,并提供一些实用的代码示例,以帮助读者更好地理解Vue3的使用方法。通过了解Vue2和Vue3之间的差异,使用Vue CLI工具和迁移指南,以及检查和更新相关的依赖项和插件,我们可以顺利地完成升级,并享受Vue3带来的新特性和性能优化。6.更新相关插件和工具:在升级完成后,我们还需要更新相关的插件和工具,如Vue Devtools和Vite等,以确保能够充分利用Vue3的新功能和工具。

pingguocu3的博客 1268

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

vue遗漏的知识点(动态组件.组件库的操作使用)

【代码】vue遗漏的知识点(动态组件.)

2302_77002233的博客 393

【Vuejs】1146- 这些 Vue 的技巧你都掌握了吗?

前言文章目的昭然若揭????‍????,整理汇总 Vue 框架中重要的特性、框架的原理。那 "前车之鉴" 从何而来?是的,我又要讲小故事了,但这次是故事的续集。故事第 1 集:CSS预处理器,你还是只...

pingan8787 600

iTerm2 Python API 实战:用 StatusBarComponent 编写 Mouse Mode 状态栏组件

本文基于 iTerm2 官方 Python 库文档中的 [mousemode.rst](https://link.gitcode.com/i/8338279fd2b2477fb76832688d73b966) 示例,讲解如何通过 `iterm2.StatusBarComponent` 与 `StatusBarRPC` 注册一个**实时显示鼠标上报(mouse reporting)状态**的自定义状

gitblog_01008的博客 615

Vue3 自动路由配置:使用 unplugin-vue-router 提升开发效率

自动路由是指根据文件系统的目录结构自动生成路由配置的功能。通过约定的文件命名和目录结构,框架可以自动识别并创建对应的路由,无需手动编写路由配置。如果需要添加自定义路由,可以通过扩展自动生成的routesroutes: [...routes,meta: {},],});使用可以大大简化 Vue3 项目的路由配置工作,通过约定优于配置的理念,让开发者专注于业务逻辑的实现。自动路由不仅提高了开发效率,还减少了人为错误的可能性,是大型 Vue3 项目的理想选择。

askein的博客 1334

Vue知识点

Vue知识点 1.对slot与slot-scope的理解 Vue 2.0学习笔记:Vue组件内容分发(slot) 由于slot是一块模板,因此对于任何一个组件,从模板种类的角度来分,共实都可分为非插槽模板和插槽模板。其中非插槽模板指的是HTML模板(也就是HTML的一些元素,比如div、span等构成的),其显与否及怎么显示完全由插件自身控制;但插槽模板(也就是slot)是一个空壳子,它显示...

了凡 1400
上一篇: vue自定义指令实现打字效果
下一篇: 【CSS/HTML】圣杯布局和双飞翼布局实现两侧宽度固定,中间宽度自适应及其他扩展实现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值