摘要:自定义事件我们知道,父组件使用传递数据给子组件。另外,父组件可以在使用子组件的地方直接用来监听子组件触发的事件。为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板。
自定义事件
使用 绑定自定义事件v-on我们知道,父组件使用 prop 传递数据给子组件。但子组件怎么跟父组件通信呢?这个时候 Vue 的自定义事件系统就派得上用场了。
每个 Vue 实例都实现了事件接口,即:
使用 $on(eventName) 监听事件
使用 $emit(eventName) 触发事件
Vue 的事件系统与浏览器的 EventTarget API 有所不同。尽管它们的运行起来类似,但是 $on 和 $emit 并不是addEventListener 和 dispatchEvent 的别名。
另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。
不能用 $on 侦听子组件释放的事件,而必须在模板里直接用 v-on 绑定,参见下面的例子。
//定义子组件 var Child = { //获取data()中的数据,并添加一个点击事件 template: ``, data(){ return { counter: 0 } }, methods:{ addCounter(){ this.counter++; //自定义事件$emit传回根组件,同时调用根组件方法 this.$emit("add-parent-total") } } } //根组件 var vm = new Vue({ el: "#app", data:{ total: 0 }, components: { Child }, methods: { //根组件中子组件改变根组件的方法 addTotal(){ this.total++ } } }) //html使用插槽分发内容
注意两点:
为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板。这个过程被称为内容分发 (即 Angular 用户熟知的“transclusion”)。Vue.js 实现了一个内容分发 API,参照了当前 Web Components 规范草案,使用特殊的
//slot插槽使其可以在html中传入数据,也可以在其中传入默认内容 var Child = { template: `1` } var vm = new Vue({ el: "#app", components: { Child } }) html默认内容 hello
有名slot
//slot插槽使其可以在html中传入数据,也可以在其中传入默认内容 var Child = { template: `非父子组件1` } var vm = new Vue({ el: "#app", components: { Child } }) htmlheader 默认内容 footer 头部内容22222底部内容
有时候,非父子关系的两个组件之间也需要通信。在简单的场景下,可以使用一个空的 Vue 实例作为事件总线:
var bus = new Vue() var AppHead = { template: "", methods: { add() { // 触发组件A中的事件 bus.$emit("change", 1) } } } var AppBody = { template: "模态框实例{{ counter }}", data() { return { counter: 0 } }, created() { //在组件B创建的钩子中监听事件 bus.$on("change", count => { this.counter += count }) } } var vm = new Vue ({ el: "#app", components: { AppHead, AppBody } })
vue路由Document 注册 登录 注册
登录
对于大多数单页面应用,都推荐使用官方支持的 vue-router 库。更多细节可以看 vue-router 文档。
静态路由不需要复杂的路由
首先需要 npm i -S vue-router 安装router库 var NewsComponent = { template: `动态路由新闻`} var ShopComponent = { template: `商场`} var NotFoundComponent = { template: `404`} var routes = [ { path: "/", redirect: "/news"//默认根目录跳转 }, { path: "/news", component: NewsComponent }, { path: "/shop", component: ShopComponent }, { path: "*", component: NotFoundComponent } ] var router = new VueRouter({ routes }) // var app = new Vue({ // el: "#app", // router // }) var app = new Vue({ el: "#app", router })
var Goods = { template: ``, watch: { $route (to, from) { console.log(to.params.id); axios.get("http://h6.duchengjiu.top/shop/api_goods.php?cat_id="+to.params.id).then(res => { console.log(res.data.data) this.goods = res.data.data }) } }, data() { return { goods: [] } } } var router = new VueRouter({ routes: [ { path: "/cat/:id", component: Goods } ] }); var vm = new Vue({ el: "#app", router, data: { cats: [] }, created() { axios.get("http://h6.duchengjiu.top/shop/api_cat.php").then(res => { console.log(res) this.cats = res.data.data }) } });
- {{ good.goods_name }} {{ good.price }}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/51497.html
vue 头条 demo 写在前面 总结一下写 demo 过程中 遇到的一些问题,方便自己的学习总结!如有错误,还请指正! 一直想学习使用 vue ,并准备以后在实际项目使用,之前跟着慕课网 黄轶 老师 敲了一下 饿了么商品购买页的demoele效果预览 该 demo 借鉴自 hcy1996-github 这个项目,但内部内容,布局风格,完全不同,只为共同学习,共同交流 数据接口 直接打开 今日...
摘要:本文总结了组件间通信的几种方式,如和,以通俗易懂的实例讲述这其中的差别及使用场景,希望对小伙伴有些许帮助。状态改变提交操作方法。 前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。一般来说,组件可以有以下几种关系:showImg(https://segmentfault.com/img/remote/146000001...
摘要:本文总结了组件间通信的几种方式,如和,以通俗易懂的实例讲述这其中的差别及使用场景,希望对小伙伴有些许帮助。状态改变提交操作方法。前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。一般来说,组件可以有以下几种关系: showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac35bf...
阅读 2995·2021-11-23 10:09
阅读 2021·2021-10-26 09:51
阅读 941·2021-10-09 09:44
阅读 3870·2021-10-08 10:04
阅读 2721·2021-09-22 15:14
阅读 3547·2021-09-22 15:02
阅读 965·2021-08-24 10:03
阅读 1689·2019-12-27 12:14