博客列表 >Vue3组件的传值、插槽,Vue3新路由和子路由配置和使用

Vue3组件的传值、插槽,Vue3新路由和子路由配置和使用

Jet的博客
Jet的博客原创
2023年04月02日 16:33:451882浏览

一、Vue3组件的传值

1、传值

  • App.vue文件
  1. <template>
  2. <div>欧阳克</div>
  3. <OyDiv style="color:red;" size="2" type="wrning">欧阳组件</OyDiv>
  4. <Ztp></Ztp>
  5. </template>
  6. <script>
  7. import OyDiv from "./components/OyDiv.vue";
  8. export default{
  9. // data:数据; methods:js计算属性等;
  10. // components:组件; 使用组件,传值
  11. components:{
  12. OyDiv
  13. },
  14. }
  • OyDiv.vue组件文件(组件文件)
  1. <template>
  2. <div>{{ size }}</div>
  3. <div>{{ type }}</div>
  4. </template>
  5. <script>
  6. export default({
  7. // 1.组件里面的api都是和页面文件一样的
  8. // props:配置项,是接收传值的
  9. // props:接收的值,直接跟data里的数据一样使用
  10. props: ['size', 'type']
  11. })
  12. </script>


2、可以多个组件

  • App.vue文件
  1. <template>
  2. <div>欧阳克</div>
  3. <!--
  4. <oy-div style="color:red;" size="2">欧阳组件</oy-div>
  5. <OyDiv style="color:red;" size="2">欧阳组件</OyDiv>
  6. -->
  7. <OyDiv style="color:red;" size="2" type="wrning">欧阳组件</OyDiv>
  8. <Ztp></Ztp>
  9. </template>
  • Ztp.vue文件(组件文件)
  1. <template>
  2. <div>朱天蓬组件</div>
  3. </template>


3、组件引入多个子组件

  • App.vue组件文件
  1. <template>
  2. <div>欧阳克</div>
  3. <OyDiv style="color:red;" size="2" type="wrning">欧阳组件</OyDiv>
  4. </template>
  5. <script>
  6. import OyDiv from "./components/OyDiv.vue";
  7. export default{
  8. // data:数据; methods:js计算属性等;
  9. // components:组件; 使用组件,传值
  10. components:{
  11. OyDiv
  12. },
  13. }
  • Ztp.vue子组件
  1. <template>
  2. <div>{{ size }}</div>
  3. <div>{{ type }}</div>
  4. <Ztp></Ztp>
  5. </template>
  6. <script>
  7. import Ztp from "./Ztp.vue";
  8. export default({
  9. // 1.组件里面的api都是和页面文件一样的
  10. // props:配置项,是接收传值的
  11. // props:接收的值,直接跟data里的数据一样使用
  12. props: ['size', 'type'],
  13. components: {
  14. Ztp
  15. }
  16. })
  17. </script>


4、传值的配置项

  • app.vue文件
  1. <template>
  2. <div>欧阳克</div>
  3. <OyDiv style="color:red;" :arr="arr_v" types="wrning">欧阳组件</OyDiv>
  4. </template>
  5. <script>
  6. import OyDiv from "./components/OyDiv.vue";
  7. export default{
  8. // data:数据; methods:js计算属性等;
  9. // components:组件; 使用组件,传值
  10. components:{
  11. OyDiv
  12. },
  13. data(){
  14. return {
  15. arr_v:[
  16. "欧阳克",
  17. "朱天蓬"
  18. ],
  19. }
  20. },
  21. }
  • OyDiv.vue文件
  1. <template>
  2. <div>{{ size }}</div>
  3. <div>{{ types }}</div>
  4. <div>{{ arr }}</div>
  5. <Ztp></Ztp>
  6. </template>
  7. <script>
  8. import Ztp from "./Ztp.vue";
  9. export default({
  10. // 1.组件里面的api都是和页面文件一样的
  11. // props:配置项,是接收传值的
  12. // props:接收的值,直接跟data里的数据一样使用
  13. props: {
  14. size: {
  15. type : Number,
  16. required: true,
  17. default: 0
  18. },
  19. types: {
  20. type : String
  21. },
  22. arr : {
  23. type : Array
  24. }
  25. },
  26. components: {
  27. Ztp
  28. }
  29. })
  30. </script>


5、判断值赋予样式

  • OyButton.vue文件
  1. <template>
  2. {{ size }}
  3. {{ type }}
  4. <button v-if="type==''" class="bottom">按钮</button>
  5. <button v-else-if="type=='primary'" class="bottom oy-button--primary">按钮</button>
  6. </template>
  7. <script>
  8. export default({
  9. props: {
  10. size: {
  11. },
  12. type: {
  13. },
  14. },
  15. })
  16. </script>
  17. <style scoped>
  18. button { xxx }
  19. .oy-button--primary { xxx }
  20. <style>

  • App.vue文件
  1. <template>
  2. <div>欧阳克</div>
  3. <!--<OyDiv style="color:red;" :arr="arr_v" types="wrning">欧阳组件</OyDiv>-->
  4. <OyButton size="large" type=""></OyButton>
  5. </template>
  6. <script>
  7. import OyDiv from "./components/OyDiv.vue";
  8. import OyButton from "./components/OyButton.vue";
  9. export default{
  10. // data:数据; methods:js计算属性等;
  11. // components:组件; 使用组件,传值
  12. components:{
  13. OyDiv,
  14. OyButton
  15. },
  16. }
  17. </script>


  1. <OyButton size="large" type="primary"></OyButton>


@style scoped

  • scoped:可以穿透到其他文件使用,或者本文件单独使用

6、插槽的使用方式:

  • 单个插槽

  • App.vue文件

    1. <template>
    2. <div>欧阳克</div>
    3. <!--插槽-->
    4. <OyButton size="large" type="primary">提交</OyButton>
    5. </template>
  • OnButton.vue文件

  1. <template>
  2. {{ size }}
  3. {{ type }}
  4. <button class="bottom">
  5. <!-- 添加一个插槽 -->
  6. <!-- 插槽可以在组件的任意位置 -->
  7. <slot></slot>
  8. </button>
  9. <button v-if="type==''" class="bottom">按钮</button>
  10. <button v-else-if="type=='primary'" class="bottom oy-button--primary">按钮</button>
  11. </template>


  • 多个插槽

  • App.vue文件

  1. <!--插槽-->
  2. <OyButton size="large" type="primary">
  3. 提交
  4. <span style="color:red">确定</span>
  5. <!-- 用标签来使用有名字的插槽 -->
  6. <template v-slot:one>
  7. <div style="color:greenyellow">确定</div>
  8. </template>
  9. <!-- 语法糖 # -->
  10. <template #two>
  11. <div style="color:blue">确定</div>
  12. </template>
  13. </OyButton>
  • OnButton.vue文件
  1. <template>
  2. {{ size }}
  3. {{ type }}
  4. <button class="bottom">
  5. <!-- 添加一个插槽 -->
  6. <!-- 插槽可以在组件的任意位置 -->
  7. <slot></slot>
  8. </button>
  9. <slot name="one"></slot>
  10. <slot name="two"></slot>
  11. <button v-if="type==''" class="bottom">按钮</button>
  12. <button v-else-if="type=='primary'" class="bottom oy-button--primary">按钮</button>
  13. </template>


7、子组件调用父组件方法

  • App.vue文件
  1. <template>
  2. <OyJs></OyJs>
  3. </template>
  4. <script>
  5. import OyJs from "./components/OyJs.vue";
  6. export default{
  7. components:{
  8. OyJs
  9. },
  10. data(){
  11. return {
  12. }
  13. },
  14. methods : {
  15. fun(e){
  16. console.log('父组件方法');
  17. console.log(e);
  18. }
  19. },
  20. }
  21. </script>
  • OyJs.vue文件
  1. <template>
  2. <div>OyJs</div>
  3. <div>{{ OyJs_fun() }}</div>
  4. <button @click="OyJs_fun(1)">按钮</button>
  5. </template>
  6. <script>
  7. export default({
  8. props: {
  9. },
  10. methods: {
  11. OyJs_fun(e){
  12. console.log('OyJs方法');
  13. // 使用全局属性
  14. // $parent 上一级,父级方法
  15. this.$parent.fun(e);
  16. // 最顶层,根目录
  17. this.$root.fun(e);
  18. }
  19. }
  20. })
  21. </script>


this.$parent.fun: $parent 上一级,父级方法
this.$root.fun: $root 最顶层,根目录


8、组件生命周期

声明周期 作用
beforeCreate 在创建组件之前调用
created 组件创建完成调用
beforeMount 模板挂载之前调用
mounted 模板挂载完成调用
beforeUpdate 改变内容之前调用
update 改变内容之后调用
beforeUnmout 组件销毁之前调用
unmounted 组件销毁之后调用

二、Vue3路由

  • 路由文件路径:src/router/index.js

  • 视图文件路径:src/view/XxXxx.vue

1、新增路由:

  • 1.1 创建视图文件:
  • 1.2 新建路由:
  1. import MyView from '../views/MyView.vue'
  2. routes: [
  3. {
  4. path: '/my',
  5. name: 'my',
  6. component: MyView
  7. },
  8. ]


2、单页面跳转

  1. <router-link to = "/">首页</router-link> |
  2. <router-link to ="/about">帮助页面</router-link> |
  3. <router-link to = "/my">个人中心</router-link>

在页面内刷新跳转新页面,不用怎个页面刷新


3、另外一个router跳转方法

  • app.vue文件
  1. <el-button @click="go_url()">跳转</el-button>
  1. <script>
  2. methods : {
  3. },
  4. go_url(){
  5. // 路由有个全局变量
  6. // 用选项api,都是this. 可以访问全局变量
  7. // this.$route 获取页面信息
  8. this.$router.push('/my');
  9. }
  10. },
  11. }
  12. </script>

路由跳转不支持跳转至外网,如需要可用a标签
this.$router.push:是跳转到新页面
this.$route:是获取页面信息


自行配置跳转参数

  1. go_url(){
  2. // 路由有个全局变量
  3. // 用选项api,都是this. 可以访问全局变量
  4. // this.$route 获取页面信息
  5. //this.$router.push('/my');
  6. console.log(this.$route);
  7. // 用js跳转,增加传值
  8. this.$router.push({
  9. path : '/my',
  10. query : {
  11. id:188,
  12. oid:288
  13. }
  14. });


4、子路由

  • 4.1 创建视图文件:
  • 4.2 新建路由:

  • 修改路由文件 index.js

子路由的path,不能在前面加反斜杠/

  1. import MyOrderView from '../views/MyOrderView.vue'
  2. import MyConfigView from '../views/MyConfigView.vue'
  3. const router = createRouter({
  4. history: createWebHistory(import.meta.env.BASE_URL),
  5. routes: [
  6. {
  7. path: '/my',
  8. name: 'my',
  9. component: MyView,
  10. // 子路由的path,不能在前面加反斜杠/
  11. children: [
  12. {
  13. path: 'order',
  14. name: 'my_order',
  15. component: MyOrderView,
  16. },
  17. {
  18. path: 'config',
  19. name: 'my_config',
  20. component: MyConfigView
  21. },
  22. ]
  23. },
  24. ]
  25. })
  • 修改附近视图文件 MyView.vue
  1. <template>
  2. <div>
  3. <h1>这是个人中心页面</h1>
  4. <router-link to="/my/order">订单页面</router-link> |
  5. <router-link to="/my/config">配置页面</router-link>
  6. <router-view></router-view>
  7. </div>
  8. </template>
  • 增加子路由文件:MyConfigView.vue、MyOrderView.vue
  1. <template>
  2. <div><h1>这是个人中心配置页面</h1></div>
  3. </template>
  1. <template>
  2. <div><h1>这是个人中心订单页面</h1></div>
  3. </template>

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议