vue高级特性之界面传值(父子界面,兄弟界面,非父子界面),路由配置,get传参

本文介绍Vue.js中父组件与子组件之间的多种通信方式,包括数据传递、方法调用及事件广播等,并详细讲解了基础路由配置、动态路由传参及GET传参的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    此篇文章是在idea前后端分离demo博客后,对其中的一些特性进行学习和积累。

1.父组件给子组件传值

    新建Home.vue组件和Header.vue组件,其中Home.vue组件为父组件,后者为子组件

    其中最主要的步骤如下:

  • 父组件引入子组件并用标签声明
  • 父组件需要给子组件传递哪些数据(可以传递普通数据,方法,实体等)
  • 子组件用props数组进行接收----props:['title','run'],亦可以通过调动方法,用this.父组件ID.方法进行调用
<template>
    <!-- 所有的内容要被根节点包含起来 -->
    <div id="home">
    
        <v-header :title="title" :homemsg='msg'  :run="run"  :home="this"></v-header>

        <hr>
         首页组件   

    </div>

</template>


<script>


/*
父组件给子组件传值

    1.父组件调用子组件的时候 绑定动态属性
        <v-header :title="title"></v-header>

    2、在子组件里面通过 props接收父组件传过来的数据





*/

    import Header from './Header.vue';

    export default{
        data(){
            return {               
               msg:'我是一个home组件',
               title:'首页111'
            }
        },
        components:{

            'v-header':Header
        },
        methods:{

            run(data){

                alert('我是Home组件的run方法'+data);
            }
        }


    }

</script>

<style lang="scss" scoped>

    /*css  局部作用域  scoped*/

    h2{

        color:red
    }

    
</style>

Header.vue组件

<template>


    <div>
    
        <h2>我是头部组件--{{title}}---{{homemsg}}</h2>

        <button @click="run('123')">执行父组件的方法</button>

        <br />
        <br />
        
        <button @click="getParent()">获取父组件的数据和方法</button>

       
    </div>
</template>




<script>
    
export default{


    data(){

        return{
            msg:'子组件的msg'
        }
    },
    methods:{
        getParent(){
            // alert(this.title)



            // alert(this.home.title)


            this.home.run()

        }

    },
    props:['title','homemsg','run','home']
    
}

</script>

2.父组件主动获取子组件方法和属性

  还是在之前的两个页面进行编辑......

  • 引入子组件后定义一个ref属性----<rou1 :title="title" :run="run" ref="r1"></rou1>
  • 父组件可以通过按钮等方式获取子组件方法----this.$refs.r1.children();
  • 子组件定义相应方法或者属性调用即可。

3.子组件主档获取父组件的方法和属性

  • 确保父组件中引入了子组件----import Header from './Header.vue';
  • 子组件使用this.$parent.属性即可获取相应的父组件的属性和方法

4.非父子组件互相传值:(事件广播的方式)

  • 在main.js中引入基本的vue组件(一般都已经引入了)
  • 在传值和接收传值页面导入vueEvent.js
  • 传值页面使用:VueEvent.$emit('to-home',this.msg)-----第一个字段可以理解为标识,第二个字段为数据
  • 接收传值页面可以使用勾子函数mounted函数进行接收:
mounted(){            
            //监听news 广播的数据
            VueEvent.$on('to-home',function(data){
                console.log(data);
            })
        }

  类似于一个监听事件,监听传值页面发出的to-home事件

5.基础路由---在main.js中进行配置---默认路由为没匹配到则跳转到首页

//导入依赖
import VueRouter from 'vue-router';
Vue.use(VueRouter);

1引入组件
import home from './components/Home.vue'
import news from './components/News.vue'
//2.配置路由   注意:名字

const routes = [
  { path: '/home', component: home },
  { path: '/news', component: news },

  { path: '*', redirect: '/home' }   /*默认跳转路由*/
]


//3.实例化VueRouter  注意:名字
const router = new VueRouter({
  routes // (缩写)相当于 routes: routes
})

//加载实例化的vue
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

父子路由配置,需要在父路由中进行绑定和配置

{ path: '/user', component: user,
    children:[
      { path: 'useradd', component: UserAdd },

      { path: 'userlist', component: Userlist }
    ]
    }

路由配置除了在main.js中进行配置,还需在相应地方配置路由标签

    <router-link to="/home">首页</router-link>
    <router-link to="/news">新闻</router-link>
    <router-link to="/user">用户</router-link>
    <router-view></router-view>

router-link可以理解为子路由标签上图中的to标签代表main.js中配置的路由名称,router-view可以理解为启动路由标签

如果是父子路由的话,可以在main.js配置路由后,在父页面设定子路由的路径,最后router-view开启路由,实例如下:

<template>
    <div id="user">
        <div class="user">
            <div class="left">
                  <ul>
                      <li>
                        <router-link to="/user/useradd"> 增加用户</router-link>
                      </li>

                      <li>
                            <router-link to="/user/userlist"> 用户列表</router-link>  
                    </li>
                  </ul>
            </div>

            <div class="right">
                  <router-view></router-view>
            </div>
        </div>
    </div>
</template>

<script>
     export default {
        data() {
            return {
                msg:'这是user页面'
            }
        }
}
</script>

<style>
    .user{

        display:flex;

        .left{

            width:200px;

            min-height:400px;

            border-right:1px solid #eee;

            li{

                line-height:2;
            }
        }

        .right{
            flex:1;
        }

    }
</style>

6.动态路由传参

  • main.js中配置content参数为{ path: '/content/:id', component: content },其中的:id类似于http请求中的path参数
  • 页面配置的时候进行匹配<router-link :to="'/content/'+key">{{key}}---{{item}}</router-link>
  • this.$router.push({ path: '/content/495' });-----发出

  • console.log("aid为:"+this.$route.params.aid);----打印动态路由参数

一个简单的请求如下

var api='http://www.phonegap100.com/appapi.php?a=getPortalArticle&aid='+aid;
            console.log("api1111111:"+api);
            this.$http.get(api).then((response)=>{
                console.log(response);
                this.list = response.body.result[0];
            },(err)=>{
                console.log(err);
            })

7.get传参

  其实方式和动态路由传参大同小异

  • <router-link :to="'/product?id='+key"> {{key}}----{{pro}}</router-link>----配置get路径
  • { path: '/product', component: product }-----main.js中配置(不需要配置)
  •  console.log(this.$route.query);----打印get请求参数

总结一下:

      1.有时候不能一味的追求官方文档,还是得看下视频,否则官网出错了自己还不知道

      2.学无止境,时刻保持谦逊的心

### Vue父子组件路由传参的方法 在 Vue.js 的开发过程中,父子组件间的通信是一个常见的需求。无论是通过 `props`、`provide/inject` 或者其他机制,都可以实现数据的递以及方法的调用。 #### 使用 Props 实现父到的数据递 当使用路由配置时,可以通过动态参数的方式,在路由跳转的过程中将数据作为查询字符串或者路径参数递给目标组件。接收方可以在其生命周期钩函数中捕获这些参数并将其绑定至内部状态或属性上[^1]。 例如,在定义路由规则的时候: ```javascript const routes = [ { path: '/parent/:id', component: ParentComponent, children: [ {path: 'child', component: ChildComponent} ] } ]; ``` 假设我们希望从父级页面页面发送一些额外的信息,则可以在导航链接处指定具体数: ```html <router-link :to="{name:'ChildRouteName', params:{parentId:this.parentId}}">Go to child</router-link> ``` 而在组件里读取这个常简单: ```javascript export default{ data(){ return {}; }, computed:{ parentId(){ return this.$route.params.id; } } }; ``` 如果需要进一步把获取到的结果转化为响应式的变量或者其他形式的操作逻辑的话,也可以借助于 Vuex store 来完成全局共享的状态管理[^3]。 #### Provide / Inject 方式适用于多层嵌套场景下的依赖注入 对于某些特定情况下(比如主题颜色设置),可能并不适合采用统的 prop drilling 技术逐层向下播相同的配置项;此时就可以考虑运用 provide 和 inject 功能来简化这一过程[^2]。 提供端代码如下所示: ```javascript // App.vue or any ancestor component <script> import ThemeService from './theme-service'; export default { provide() { const themeContext = new ThemeService(); Object.defineProperty(themeContext, '_instance_', { get: () => this, enumerable: false, }); return { themeContext }; }, mounted() {}, }; </script> ``` 消费侧只需要声明即可获得实例对象: ```javascript // Some deep nested child component <script> export default { inject: ['themeContext'], created() { console.log(this.themeContext.getThemeColor()); } }; </script> ``` 以上两种途径均能够满足不同层次上的交互需求,开发者应根据实际应用场景灵活选用最合适的解决方案^。 ### 总结 综上所述,Vue 提供了多种手段用于解决父子组件之间乃至更复杂结构中的通讯难题。其中 props 主要针对单方向输入型关联设计,而 provide/inject 则更适合处理跨越多个中间节点的情况。另外还有 event bus 及 vuex 等工具可供选择依据具体情况决定最佳实践方案.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值