Vue:在下面的这个例子中,为什么需要将点击事件告诉父组件?原理是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
manyfreebug
V2EX    Vue.js

Vue:在下面的这个例子中,为什么需要将点击事件告诉父组件?原理是什么?

  •  
  •   manyfreebug 2019-07-06 12:23:3 +08:00 4490 次点击
    这是一个创建于 2355 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Vue:在下面的这个例子中,为什么需要将点击事件告诉父组件?原理是什么?也可以用伪代码示例一下 



    11 条回复    2019-07-06 22:08:54 +08:00
    murmur
        1
    murmur  
       2019-07-06 12:31:41 +08:00
    这就是组件封装的自定义事件写法啊。。
    murmur
        2
    murmur  
       2019-07-06 12:33:48 +08:00
    他这个例子上面写的不恰当,我记得组件上的 click 要写 @click.native 吧
    hfc
        3
    hfc  
       2019-07-06 12:34:33 +08:00
    说明实际处理事件的是父组件
    1KN6sAqR0a57no6s
        4
    1KN6sAqR0a57no6s  
       2019-07-06 13:02:02 +08:00   3
    为什么要将点击事件告诉父组件:因为 Vue 的数据驱动视图、单向数据流的理念让你不得不将点击事件告诉父组件。就拿你看的这个例子来说,子组件 todo-item 想把自己删了,但是它自己并没有一个属性可以控制自己是否被删除,因为真正让自己出现的是父组件里的 list。只要从父组件里的 list 里去掉自己的名字,自己就会瞬间消失。要怎么从父组件里的 list 去掉自己的名字呢,最简单的方法就是告诉父组件:”删除,我”。
    learnshare
        5
    learnshare  
       2019-07-06 13:53:16 +08:00
    为了让父组件处理数据
    这体现了 GUI 系统中的核心概念,一切都是由事件驱动的
    manyfreebug
        6/span>
    manyfreebug  
    OP
       2019-07-06 14:40:00 +08:00 via Android
    @YuxiangLuo 子组件要是能直接使用父组件里的数据那多好
    Curtion
        7
    Curtion  
       2019-07-06 14:49:24 +08:00 via Android   1
    @manyfreebug #6 $parent 可以拿到值,你也可以通过 prop 传值啊,vue 提倡单向数据,不建议子组件修改父组件的值。要不你使用 vuex 吧
    hoyixi
        8
    hoyixi  
       2019-07-06 18:28:31 +08:00   1
    Vuejs 单向数据流

    父组件把数据通过 props 给子组件,子组件用自己的方式展示,通常子组件不要修改父组件传递过来的数据(比如,该数据可能在其它组件中用到,子组件改了,可能会造成数据不一致),而是由父组件来做,所以发个通知(事件)给父组件。
    agdhole
        9
    agdhole  
       2019-07-06 18:31:57 +08:00
    rxjs 保平安
    SilentDepth
        10
    SilentDepth  
       2019-07-06 19:30:19 +08:00   1
    @manyfreebug #6
    「子组件要是能直接使用父组件里的数据那多好」
    「子组件要是能直接使用祖父组件里的数据那多好」
    ……
    「子组件要是能直接使用所有组件里的数据那多好」

    这样的结果就是,状态集中于某个组件,或无序地分散在多个组件,从而失去了组件化的意义。

    当然讲究状态分层就会带来一定的访问障碍,这是难以避免的副作用。(所以 Vue 3 的 Hooks 好啊!)
    Mutoo
        11
    Mutoo  
       2019-07-06 22:08:54 +08:00   1
    Re: "子组件要是能直接使用父组件里的数据那多好"
    子组件不应该直接修改父组件的内容,那样会对父组件产生依赖,增加两个组件间的耦合度。这样的子组件很难复用到其它地方。
    解决方案就是使用消息来解耦合。
    以这个删除事件为例,这个子组件可以被不同的父组件复用,而不关心父组件使用何种数据结构。
    子组件只关心自己要呈现什么数据,而用事件来通知父组件何时去删除绑定的数据。
    父组件侦听这个删除事件,并根据自己的数据结构来删除数据。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1452 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 16:41 PVG 00:41 LAX 08:41 JFK 11:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86