需要先切换到node版本为v18.16.0,v12的版本安装报错 nvm use 18.16.0
npm init vue@latest
cd runoob-vue3-test npm install npm run format npm run dev
npm init vite-app runoob-vue3-test2
cd runoob-vue3-test2 cnpm install cnpm run dev
查看是否安装vue cli vue -V 安装vue CLI npm install -g @vue/cli
vue create runoob-vue3-app cd runoob-vue3-app npm run serve
疑问❓:为什么目录里少了build、config、static文件夹
界面化 vue ui
<div id="app" class="demo">
<input type="text" v-model="message">
<p>{{ message }}</p>
</div>
<script>
const HelloVueApp = {
data() {
return {
message: 'Hello Vue!!'
}
}
}
Vue.createApp(HelloVueApp).mount('#app')
</script>
createApp:起点 mount:挂载到DOM元素中
const app = Vue.createApp({
data() {
return { count: 4 }
},
methods: {
increment() {
// `this` 指向该组件实例
this.count++
}
}
})
const vm = app.mount('#app')
document.write(vm.count) // => 4
vm.increment()
v-bind v-bind:src="" v-if v-if="" v-show v-show="" v-for v-for="(item, index) in items" :key="item.id" v-on v-on:click="" v-model v-model=""
{{...}} v-once 指令执行一次性地插值
v-html rawHtml: '这里会显示红色!'
v-bind 按钮
绑定class类的样式
{{5+5}}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
除了前面的,下面补充几个
v-bind:属性(src/href)
v-on:click=""
@click=""
<a @[event]="doSomething"> ...
.
v-model:双向绑定,用来在 input、select、textarea、checkbox、radio
<a @click="doSomething">
v-for
v-for="(value,key) in object"
v-for="(value, key, index) in object"
v-for="n in 10"
注册一个全局组件: const app = Vue.createApp({...})
app.compoment('my-component-name', {
data() {
return {
count: 0
}
},
template: <button @click="count++"> 点了 {{ count }} 次! </button>
})
使用:
注意:template 中 ` 是反引号,不是单引号 '。
const ComponentA = { /* ... */ }
const app = Vue.createApp({ components: { 'component-a': ComponentA, 'component-b': ComponentB } })
属性:组件传值 props: ['title'],
父类用v-bind
props: {
// 基础的类型检查 (null
和 undefined
会通过任何类型验证)
propA: Number,
// 多个可能的类型
propB: [String, Number],
// 必填的字符串
propC: {
type: String,
required: true
},
// 带有默认值的数字
propD: {
type: Number,
default: 100
},
// 带有默认值的对象
propE: {
type: Object,
// 对象或数组默认值必须从一个工厂函数获取
default: function () {
return { message: 'hello' }
}
},
// 自定义验证函数
propF: {
validator: function (value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
type 可以是下面原生构造器:
String Number Boolean Array Object Date Function Symbol type 也可以是一个自定义构造器,使用 instanceof 检测。
computed
computed: {
// 计算属性的 getter
reversedMessage: function () {
// this
指向 vm 实例
return this.message.split('').reverse().join('')
}
}
性能:computed > methods
computed: { site: { // getter get: function () { return this.name + ' ' + this.url }, // setter set: function (newValue) { var names = newValue.split(' ') this.name = names[0] this.url = names[names.length - 1] } }
watch
vm = Vue.createApp(app).mount('#app') vm.$watch('counter', function(nval, oval) { alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!'); })
v-bind:xxx :xxx
也可以通过computed返回一个样式
computed: { classObject() { return { active: this.isActive, 'text-danger': this.error } } }
三元表达式
v-bind:style / :style
绑定样式对象
常用于提供多个带前缀的值
当你在带有单个根元素的自定义组件上使用 class 属性时,这些 class 将被添加到该元素中。此元素上的现有 class 将不会被覆盖。
$attrs:定义哪些部分将接收这个类
app.component('runoob', {
template: <p :class="$attrs.class">I like runoob!</p> <span>这是一个子组件</span>
})
v-on:xxx / @xxx
事件处理程序中可以有多个方法,这些方法由逗号运算符分隔
<button @click="one($event), two($event)"> 点我
.stop - 阻止冒泡 .prevent - 阻止默认事件 .capture - 阻止捕获 .self - 只监听触发该元素的事件 .once - 只触发一次 .left - 左键事件 .right - 右键事件 .middle - 中间滚轮事件
常用keyCod:
全部的按键别名:
.enter .tab .delete (捕获 "删除" 和 "退格" 键) .esc .space .up .down .left .right 系统修饰键:
.ctrl .alt .shift .meta 鼠标按钮修饰符:
.left .right .middle
.exact 修饰符
<button @click.ctrl="onClick">A
<button @click.ctrl.exact="onCtrlClick">A
<button @click.exact="onClick">A
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组: 单选 {{ checked }} 多选 Runoob Google
Runoob 选择一个网站 Runoob Google ... // 选中时 vm.toggle === 'yes' // 取消选中 vm.toggle === 'no' // 当选中时 vm.pick === vm.a 123 // 当被选中时 typeof vm.selected // => 'object' vm.selected.number // => 123