首
文档
安装
1、安装nodejs(链接),18.0以上版本。
2、在想要创建项目的目录下执行命令
npm create vue@latest
按提示创建项目,其中vue router是实现路由功能,pinia实现组件之间共享数据。如果项目需要两个功能建议选择yes。
3、
cd <your-project-name>
npm install
npm run dev
启动项目访问所给链接即可。
安装bootstrap
如果创建项目时,部分功能没有选择,之后可手动加入,以bootstrap为例。
项目目录下执行:
npm install bootstrap
在main.js中引入:
//import './assets/main.css'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap/dist/js/bootstrap'import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'const app = createApp(App)app.use(createPinia())
app.use(router)app.mount('#app')
pinia和router也像这样引入,如果自定义样式记得删除man.css样式,App.vue中的样式不需要也可以删除。
vue文件结构
创建/src/components/NavBar.vue:
<script setup>
</script><template>
<nav class="navbar navbar-expand-lg bg-body-tertiary"><div class="container-fluid"><a class="navbar-brand" href="#">Navbar</a><button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarNavAltMarkup"><div class="navbar-nav"><a class="nav-link active" aria-current="page" href="#">Home</a><a class="nav-link" href="#">Features</a><a class="nav-link" href="#">Pricing</a><a class="nav-link disabled">Disabled</a></div></div></div>
</nav>
</template><style scoped>
</style>
分为三部分script(js)、template(html)和style(css)。script的setup可以帮用户完成很多东西,也可以不写然后手动设置,详细请看文档。style的scoped是为了让不同vue组件间css样式名称不产生冲突。
在App.vue中引入:
<script setup>
import NavBar from './components/NavBar.vue'
</script><template><NavBarVue /><RouterView />
</template><style scoped></style>
RouterView是每个路由对应的视图。
基础知识
template获取script变量
创建组件/scr/components/TestSon.vue:
<script setup>const msg = "hello world";
</script><template><span>{{ msg }}</span>
</template>
script中定义变量,template使用{{}}进行获取。
接受父组件参数
修改TestSon.vue:
<script setup>const pros = defineProps({msg: {type: String,required: true,}})
</script><template><span>{{ pros.msg }}</span>
</template>
使用defineProps定义组件接受的参数。
创建组件/scr/components/TestParent.vue:
<script setup>
import TestSon from './TestSon.vue';
</script><template><TestSon msg="123" />
</template>
<TestSon />是<TestSon></TestSon>的缩写,父组件直接以属性的方式传递参数。
向组件中传递模板
编写组件HomeContent.vue:
<script setup>import ContentBase from './ContentBase.vue';
</script>
<template><ContentBase><h1>title</h1><p>I have a dream...</p></ContentBase>
</template>
我们希望有一个类似容器的组件contentbase,容纳当前编写的模板内容。
ContentBase:
<template><div class="container"><div class="card"><slot /></div></div>
</template>
使用slot槽来接受内容,夹在<ContentBase>之间的内容会替换<slot>的位置。
属性绑定
上述例子中父组件传递的参数msg是固定string,我们也可以通过v-bind动态的绑定:
<script setup>
import TestSon from './TestSon.vue';const msg = "123";
</script><template><TestSon v-bind:msg="msg" />
</template>
也可以简写为:
<TestSon :msg="msg" />
条件渲染
<script setup>const flag = true;
</script><template><div v-if="flag">真的</div><div v-else>假的</div>
</template>
列表渲染
<script setup>const list = ["alice", "bob"];
</script><template><div v-for="item in list" :key="item">{{ item }}</div>
</template>
需要绑定key,要求每个样例key不同。
事件处理
<script setup>
function say(msg){alert(msg);
}
</script><template><button v-on:click="say('hello')">Say hello</button>
</template>
可简写:
<button @click="say('hello')">Say hello</button>
输入绑定
<script setup>
import { ref } from "vue";const message = ref();
</script><template><p>Message is: {{ message }}</p><input v-model="message" placeholder="edit me" />
</template>
如果需要在script中使用message的值,需要使用message.value来访问。ref用来声明响应式状态,对于一些复杂类型如object,可以使用reactive代替ref。
访问DOM
<script setup>
import { ref, onMounted } from 'vue'// 声明一个 ref 来存放该元素的引用
// 必须和模板里的 ref 同名
const input = ref(null)onMounted(() => {input.value.focus()
})
</script><template><input ref="input" />
</template>
onMounted会在组件加载完之后调用,只会执行一次,input.value是组件实例。
子组件向父组件抛出事件
父组件TestParent
<script setup>
import TestSon from './TestSon.vue';const say = () => {alert("hi");
};
</script><template><TestSon @parent_event="say" />
</template>
子组件TestSon
<script setup>const emit = defineEmits(["parent_event"]);emit('parent_event');
</script><template></template>
也可通过$emit直接抛出
<script setup></script><template><button @click="$emit('parent_event')">emit</button>
</template>