造轮子-toast组件的实现(下)

1.解决 toast 中传入 html 的问题,通过假的 slot 来实现

// plugins.js
toast.$slots.default = [message]
// toast.vue
 <div v-html="$slots.default[0]"></div>
// 使用
created() {
    this.$toast('<p>我是<strong>hi</strong></p>',{})
},

2.在 toast 中加 html 是比较危险的一个动作,所以要加一个选项默认不开启。

// toast.vue
<slot v-if="!enableHtml"></slot>
<div v-else v-html="$slots.default[0]"></div>
// plugin.js,进行传递参数的改写
propsData:toastOptions
// 使用
created() {
  this.$toast('<p>我是<strong>hi</strong></p><a href="http://qq.com">qq</a>',{
    enableHtml: false
  })
},

3.flex-shrink的使用,flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

.item {
  flex-shrink: <number>; /* default 1 */
}

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。如果数值越大,缩小比例越大。

4.line的高度问题,如果高度写了最小高度,那么子元素的height%就不生效了。用js去操作line的高度。

// toast.vue
<div class="toast" ref="wrapper">
    <div class="line" ref="line"></div>
</div>

mounted() {
  this.$nextTick(()=>{
    this.$refs.line.style.height = `${this.$refs.wrapper.getBoundingClientRect().height}px`
  })
}, // 这个计较太trick

debugger的技巧,如果眼睛观察到的是0,但是打印出来不是0,可能就是异步的问题。

5.增加toast的位置。

// toast.vue
props: {
  position: {
    type: String,
    default: 'top',
    validator(value){
      return ['top', 'bottom', 'middle'].indexOf(value) >= 0
    }
  }
},
computed:{
  toastClasses(){
    return {
      [`position-${this.position}`]:true
    }
  }
}
// 使用
this.$toast('你的智商需要充值', {
  position: 'bottom'
})
// plugin.js
export default {
  install(Vue, options){
    Vue.prototype.$toast = function (message, toastOptions) {
      let Constructor = Vue.extend(Toast)
      let toast = new Constructor({
        propsData:toastOptions // 在这里将position传进去
      })
      toast.$slots.default = [message]
      toast.$mount()
      document.body.appendChild(toast.$el)
    }
  }
}

6.开始做如果已经有一个toast就把之前那个干掉,再出现。

  1. 先写一个函数
  2. 给函数取一个名字
  3. 把参数提出来
// plugin.js
import Toast from './toast'

let currentToast

export default {
  install(Vue, options){
    Vue.prototype.$toast = function (message, toastOptions) {
      if(currentToast){
        currentToast.close()
      }
      currentToast = createToast({Vue,message, propsData: toastOptions})
    }
  }
}

/* helpers */
function createToast ({Vue,message,propsData}){
  let Constructor = Vue.extend(Toast)
  let toast = new Constructor({propsData})
  toast.$slots.default = [message]
  toast.$mount()
  document.body.appendChild(toast.$el)
  return toast
}

7.实现动画

  1. 声明一个动画,然后写到类上面
   @keyframes fade {
     0% {opacity: 0; transform: translateY(100%);}
     100% {opacity: 1;transform: translateY(0);}
   }
   .toast {
     animation: fade 1s;
   }
  1. 这里有个bug,我们在实现一次的时候是有问题的,如果toast被关闭了,我们不需要重复关闭,而我们写的是不管你之前的toast有没有关闭,只要有值的我们就关闭,那这样就会出现一个问题,点了关闭currentToast还是一个Toast并没有把它变成null,所以要加上一个回调告诉外面,我被关了不要重复关我,代码会多调一次close。
  // toast.vue
  close() {
    this.$el.remove()
    this.$emit('close')
    this.$destroy()
  }
  // plugin.js
  export default {
    install(Vue, options){
      Vue.prototype.$toast = function (message, toastOptions) {
        if(currentToast){
          currentToast.close()
        }
        currentToast = createToast({Vue,message, propsData: toastOptions,onclose: ()=>{
            currentToast = null
          }
        }) // 加了这句话
      }
    }
  }

  /* helpers */
  function createToast ({Vue,message,propsData,onclose}){
    let Constructor = Vue.extend(Toast)
    let toast = new Constructor({propsData})
    toast.$slots.default = [message]
    toast.$mount()
    toast.$on('close',onclose) // 加了这句话
    document.body.appendChild(toast.$el)
    return toast
  }
  1. git相关的钩上,不想管的不用钩上
  2. 回忆bug是如何产生的,默认样式是:transform:translateX(-50%),进入0%时候transform:translateY(100%),它们两会覆盖。有三个方案,解决。
    • 换一种方式去做居中,但是这种方法是最好的,很难想
    • 不要用css做动画
    • 做两个div外面一个居中,里面一个做动画
  3. 为什么不写两个动画帧来控制居中,如果一段代码要背下来,那么一定是有问题的。
  4. 优化三种动画,上下中是不一样的,通过css进行优化。

原文地址:https://www.cnblogs.com/ories/p/12234961.html

时间: 2024-07-31 05:01:53

造轮子-toast组件的实现(下)的相关文章

Vue造轮子-tab组件(下)

1. 为什么一个 new Vue 可以构造出一个 eventBus // 当我们定义了new Vue之后,可以这样用 var app = new Vue({ created(){ this.$emit() this.$on() } }) // 也可以这样用 app.$emit() app.$on() app.$off() // 那么归根结底,只要满足能触发一个事件,监听一个事件,和取消监听一个事件,那么它就是一个事件中心 eventBus eventBus.$emit() // 触发一个事件 e

造轮子-tab组件(中)

1. 如果给一个标签一个class,标签本身又有class,vue是默认会合并的.只有两个属性是这样一个是class,一个是style.这样就比较好改样式. <g-tabs-head class="red"></g-tabs> 2. 组件的结构以及selected的传递过程,见下图. 没有点击的图 发生了点击操作的图,两个item兄弟之间是没有关系的,发生了点击操作之后要做下图中的五件事情. 亮自己 熄兄弟 亮pane 熄pane 触发事件 update:sel

造轮子-tab组件(上)

1. 如何解决之前遗留的bug 根据错误提示大概确定原因,toast.test.js .style 造成. 用二分法找bug到底是哪一个用例出错. log+分析代码,mounted和$nextTick是有时间间隙的,得到原因测试用例中mount完了之后立刻click,click之后再$nextTick设置高度,所以可能是click太快了,此时s当$nextTick的时候,已经toast已经被我们关掉了,所以无法设置高度,那么解决方案就是我们就需要模拟用户点击,200ms后再点击 // toast

Vue造轮子-手风琴组件

一. 大致的使用方法 <div id="app" style="padding-left: 100px"> <g-collpase> <g-collapse-item title="标题1">内容1</g-collapse-item> <g-collapse-item title="标题2">内容2</g-collapse-item> <g-coll

GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式. 对于Android 4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice Cream Sandwich的自定义动作栏实现将自动围绕布局.能够让开发者轻松开发

Hybrid App Development: 二、关于造轮子以及在Xcode iOS应用开发中加入Cordova

转载请注明出处:http://www.cnblogs.com/xdxer/p/4111552.html [ctrl+左键点击图片可以查看原图] 在上一篇关于Hybrid App Development的文章中,我讨论了一下在iOS下UIWebView的使用方法.但是光使用一个UIWebView所提供的功能还是完全不能满足我们的需求.   关于造轮子的思考: 在UIKit中的UIWebView虽然已经提供了很多功能了,比如JavaScript和Objc之间的通信.但是考虑到一个问题,如果在Hybr

程序员为什么热衷造轮子

搜索一下"造轮子"或者"程序员为什么喜欢造轮子",会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年.不过还是有再谈的必要. "造轮子"的含义: 明知道你做的不可能比前辈做得更好,却仍然坚持要做. 就软件开发而言,"造轮子"是指,"业界已经有公认的软件或者库了,却还坚持要自己做". 在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状

造轮子和用轮子:快速入门JavaScript模块化

造轮子和用轮子:快速入门JavaScript模块化 时间 2016-03-16 21:59:39  SegmentFault 原文  https://segmentfault.com/a/1190000004619857 主题 JavaScript 前言 都说“不重复造轮子”,就像iPhone——它除了打电话还可以播放音乐——但是工程师不用从零开始做一个音乐播放功能,也许只要在iPhone的系统中整合一个ipod. 前端开发亦是如此,最理想化的开发状态就是,工程师只写核心业务代码,其他通用的功能

程序员为什么热衷造轮子?

搜索一下“造轮子”或者“程序员为什么喜欢造轮子”,会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年.不过还是有再谈的必要. “造轮子”的含义: 明知道你做的不可能比前辈做得更好,却仍然坚持要做. 就软件开发而言,“造轮子”是指,“业界已经有公认的软件或者库了,却还坚持要自己做”. 在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状况? 这篇文章就来讨论“造轮子”这件事,包括下列主题: 程序员为什么会重复造轮子 为什么有