• vue(11)


    全局事件总线(GlobalEventBus)

    1.一种组件间通信的方式,适用于任意组件间通信

    2.安装全局事件总线

    3.使用事件总线:

    1)接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件中自身

     2)提供数据

    this.$bus.$emit('xxxx',数据)

    4.最好在beforeDestory钩子中,用$off去解绑当前组件用到的事件

    1. beforeDestroy(){
    2. this.$bus.$off('hello')
    3. },

    事件被触发,事件对应的回调会执行

    哪里引入的vue,就在哪里操作vue

    实际就是把x放在Vue的原型对象

    在mounted函数中,写触发函数时要写箭头函数做回调

    vm----整个应用new出来的vue

    vc----组件实例对象

    全局的vc vm都通过$bus传递

     数据在哪里,操作数据的地方在哪里

    todolist事件总线

    app.vue

    1. <script>
    2. // 引入school组件
    3. import MyHeader from "./componments/MyHeader.vue";
    4. import MyFooter from "./componments/MyFooter.vue";
    5. import MyList from "./componments/MyList.vue";
    6. export default {
    7. name: "App",
    8. components: {MyHeader,MyFooter,MyList},
    9. data(){
    10. return{
    11. // 由于todos是MyHeader组件和MyFooter组件都在使用,所以放在App中(状态提升)
    12. // 数组为null时,length会报错,所以用[]
    13. todos:JSON.parse(localStorage.getItem('todos')) || []
    14. }
    15. },
    16. methods:{
    17. // 添加一个todo
    18. addTodo(todoObj){
    19. // console.log(todoObj);
    20. this.todos.unshift(todoObj)
    21. },
    22. // App和Item是爷孙关系,逐层传递,需要app传给list,list传给item
    23. // 勾选或取消勾选一个todo
    24. checkTodo(id){
    25. this.todos.forEach((todo)=>{
    26. if(todo.id===id) todo.done==!todo.done
    27. })
    28. },
    29. // 删除一个todo
    30. deleteTodo(id){
    31. // 用过滤器过滤掉等于id的对象
    32. this.todos=this.todos.filter(todo=>todo.id!==id)
    33. },
    34. // 全选或取消全选
    35. checkAllTodo(done){
    36. this.todos.forEach((todo)=>{
    37. todo.done=done
    38. })
    39. },
    40. // 清除所有已经完成的todo
    41. clearAllTodo(){
    42. // 过滤不会影响原数据,所以要在前面加this.todos=
    43. this.todos=this.todos.filter((todo)=>{
    44. return !todo.done
    45. })
    46. }
    47. },
    48. watch:{
    49. todos:{
    50. deep:true,
    51. handler(value){
    52. localStorage.setItem('todos',JSON.stringify(value))
    53. }
    54. }
    55. },
    56. mounted(){
    57. this.$bus.$on('addTodo',this.addTodo)
    58. this.$bus.$on('checkTodo',this.checkTodo)
    59. this.$bus.$on('deleteTodo',this.deleteTodo)
    60. },
    61. beforeDestroy(){
    62. this.$bus.$off('addTodo')
    63. this.$bus.$off('checkTodo')
    64. this.$bus.$off('deleteTodo')
    65. }
    66. };
    67. script>
    68. <style>
    69. /* 基本样式,所有的都在用 */
    70. /* base */
    71. body{
    72. background: #fff;
    73. }
    74. .btn{
    75. display:inline-block;
    76. padding: 4px 12px;
    77. margin-bottom:0;
    78. font-size:14px;
    79. line-height: 20px;
    80. text-align: center;
    81. vertical-align: middle;
    82. cursor:pointer;
    83. box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
    84. border-radius: 4px;
    85. }
    86. .btn-danger{
    87. color:#fff;
    88. background-color: #da4f49;
    89. border: 1px solid #bd362f;
    90. }
    91. .btn-danger:hover{
    92. color:#fff;
    93. background-color: #bd362f;
    94. }
    95. .btn:fouse{
    96. outline:none;
    97. }
    98. .todo-container{
    99. width: 600px;
    100. margin:0 auto;
    101. }
    102. .todo-container .todo-wrap{
    103. padding: 10px;
    104. border: 1px solid #ddd;
    105. border-radius: 5px;
    106. }
    107. style>

    myitem.vue

    1. <script>
    2. export default {
    3. name: "MyItem",
    4. // 声明接收todo对象
    5. props: ["todo"],
    6. methods: {
    7. // 勾选、取消勾选
    8. handleCheck(id) {
    9. // console.log(id);
    10. // 通知App组件将对应的todo对象的done取反,数据在哪里,操作对象的数据在哪里
    11. // this.checkTodo(id);
    12. this.$bus.$emit('checkTodo',id)
    13. },
    14. // 删除数据
    15. handleDelete(id){
    16. // 根据用户的反应来确定是否进行
    17. if(confirm('确定删除吗?')){
    18. // this.deleteTodo(id)
    19. // console.log(id);
    20. this.$bus.$emit('deleteTodo',id)
    21. }
    22. }
    23. },
    24. };
    25. script>
    26. <style>
    27. /* item */
    28. li {
    29. list-style: none;
    30. height: 36px;
    31. line-height: 36px;
    32. padding: 0 5px;
    33. border-bottom: 1px solid #ddd;
    34. }
    35. li label {
    36. float: left;
    37. cursor: pointer;
    38. }
    39. li label li input {
    40. vertical-align: middle;
    41. margin-right: 6px;
    42. position: relative;
    43. top: -1px;
    44. }
    45. li button {
    46. float: right;
    47. display: none;
    48. margin-top: 3px;
    49. }
    50. li:before {
    51. content: initial;
    52. }
    53. li:last-child {
    54. border-bottom: none;
    55. }
    56. li:hover{
    57. background-color: #ddd;
    58. }
    59. li:hover button{
    60. display: block;
    61. }
    62. style>

    mylist.vue

    1. <script>
    2. import MyItem from "./MyItem.vue";
    3. export default {
    4. name: "List",
    5. components: { MyItem },
    6. props:['todos'],
    7. };
    8. script>
    9. <style scoped>
    10. /* main */
    11. .todo-main {
    12. margin-left: 0px;
    13. border: 1px solid #ddd;
    14. border-radius: 2px;
    15. padding: 0px;
    16. }
    17. .todo-empty {
    18. height: 40px;
    19. line-height: 40px;
    20. border: 1px solid #ddd;
    21. border-radius: 2px;
    22. padding-left: 5px;
    23. margin-top: 10px;
    24. }
    25. style>
  • 相关阅读:
    java计算机毕业设计课程与成绩管理MyBatis+系统+LW文档+源码+调试部署
    测试11111111111111111111111111111111
    排列数字(DFS)
    LeetCode 2906. 构造乘积矩阵【前后缀分解,数组】中等
    JAVA:实现Kruskal克鲁斯卡尔求连通网的最小生成树算法(附完整源码)
    第三十一章 使用带附件的 SOAP
    【LeetCode】二分基本问题题解汇总
    gin 统一响应结果
    monaco-editor 行号、内容装饰器
    数据结构-数型查找
  • 原文地址:https://blog.csdn.net/m0_62520946/article/details/127599429