• vue的内置指令、vue生命周期、自定义(过滤器、指令、插件)、非单文件组件


    内置指令

          v-text

          v-html

          ref    为特定的元素添加引用标识,实例的$refs内部可以获取到

          v-on       绑定事件   简写@

          v-bind     单向数据绑定  :

          v-for    列表渲染

          v-if     条件渲染

          v-else    

          v-show     条件渲染

          v-model    (MVVM)

    v-text

    v-html

    ref是我们在vue当中获取真实dom元素的唯一方式 

    1. <body>
    2. <div id="app">
    3. <p ref="pp">{{msg}}p>
    4. <p v-text="msg">p>
    5. <p v-html="msg">p>
    6. <button @click="test">点击获取pbutton>
    7. div>
    8. <script src="../js/vue.js">script>
    9. <script>
    10. new Vue({
    11. el:'#app',
    12. data(){
    13. return {
    14. }
    15. },
    16. methods: {
    17. test(){
    18. console.log(this.$refs.pp.innerText);
    19. }
    20. },
    21. }).$mount('#app')
    22. script>
    23. body>

     vue的生命周期

    生命周期钩子(回调函数)
        给我们机会可以干预vue的工作流程
        生命周期的执行顺序是固定的
        
        创建前  初始化数据前    数据打印看不到
        创建后    初始化数据后    数据打印可以看到

        挂载前    初始页面不显示  初始页面的元素看不到 真实dom没有
        挂载后    初始页面显示       初始页面元素可以看到


        更新前    页面更新前    实例数据是对的页面渲染的数据是错的  实例数据已经更新了,页面数据没更新
        更新后    页面更新后    实例数据是对的页面渲染的数据是对的  两个都更新了

        销毁前    实例清空前    在销毁前内部清除定时器  vm还在只是里面功能没(指令和事件)
        销毁后    实例清空后    一般不用


        使用mounted和beforeDestroy比较频繁,mounted内部我们经常去做异步操作,添加事件 定时器  ajax
        当调用了vm.$destroy(),    beforeDestroy和destroyed才会执行,beforeDestroy做收尾工作:清除定时器等
     

    1. <body>
    2. <div id="app">
    3. <p ref="pp">{{msg}}p>
    4. <button @click="msg = '我爱你杨幂'">点击更新button>
    5. <button @click="$destroy()">点击销毁button>
    6. div>
    7. <script src="../js/vue.js">script>
    8. <script>
    9. Vue.config.productionTip = false
    10. new Vue({
    11. data(){
    12. return {
    13. msg:'我爱你赵丽颖'
    14. }
    15. },
    16. // 创建阶段
    17. // 创建前可以找到vm但是找不到vm数据
    18. beforeCreate() {
    19. console.log(this,this.msg);
    20. },
    21. created() {
    22. console.log(this,this.msg);
    23. },
    24. // 挂载阶段
    25. // 挂载前拿不到真实dom 挂载后可以拿到
    26. beforeMount() {
    27. console.log(this.$refs.pp);
    28. },
    29. // 挂载完成用的比较多
    30. // 通常在这里面发请求获取动态数据,修改初始化的数据
    31. // 在这里也通常去开启定时器
    32. // 在这里给真实dom绑定事件
    33. mounted() {
    34. console.log(this.$refs.pp);
    35. },
    36. // 更新阶段 (页面更新阶段)
    37. // 任何数据更新变化,都会进入这个阶段
    38. beforeUpdate() {
    39. console.log(this.msg,this.$refs.pp.innerHTML);
    40. },
    41. updated() {
    42. console.log(this.msg,this.$refs.pp.innerHTML);
    43. },
    44. // 销毁阶段
    45. // 销毁前用的比较多,一般都是在做善后处理
    46. // 比如:解绑事件、清除定时器
    47. beforeDestroy() {
    48. console.log(this,this.msg);
    49. },
    50. destroyed() {
    51. console.log(this,this.msg);
    52. this.msg = '我爱你迪丽热巴'
    53. },
    54. }).$mount('#app')
    55. script>
    56. body>

     自定义过滤器

        过滤器
        过滤顾名思义是筛选的意思,但是在vue当中过滤器不是筛选的意思
        它是把数据进行二次加工

        定义过滤器分为全局过滤器和局部过滤器

       展示数据的时候,对数据进行处理(格式化之后再显示,不会影响原数据) 
        使用moment插件
        定义全局过滤器
            Vue.filter('过滤器名字',回调函数);
        定义局部过滤器
            在vm当中fliters对象当中配置

    1. <body>
    2. <div id="app">
    3. <p>{{timeNow}}p>
    4. <p>{{timeNow | dateFormat}}p>
    5. <p>{{timeNow | dateFormat('YYYY-MM-DD')}}p>
    6. <p>{{timeNow | dateFormat('hh:mm:ss')}}p>
    7. div>
    8. <div id="app1">
    9. <p>{{timeNow}}p>
    10. <p>{{timeNow | dateFormat}}p>
    11. <p>{{timeNow | dateFormat('YYYY-MM-DD')}}p>
    12. <p>{{timeNow | dateFormat('hh:mm:ss')}}p>
    13. div>
    14. <script src="../js/vue.js">script>
    15. <script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.4/moment.min.js">script>
    16. <script>
    17. // 全局
    18. // Vue.filter('dateFormat', (value, format = 'YYYY-MM-DD hh:mm:ss') => {
    19. // return moment(value).format(format)
    20. // })
    21. new Vue({
    22. el: '#app',
    23. data: {
    24. timeNow: new Date().getTime() //Date.now()
    25. },
    26. // 局部
    27. filters: {
    28. dateFormat: (value, format = 'YYYY-MM-DD hh:mm:ss') => {
    29. return moment(value).format(format)
    30. }
    31. }
    32. })
    33. new Vue({
    34. el: '#app1',
    35. data: {
    36. timeNow: new Date().getTime() //Date.now()
    37. }
    38. })
    39. script>
    40. body>

     自定义指令

    定义全局指令
            Vue.directive('过滤器名字',回调函数);
        定义局部指令
            在vm当中directives对象当中配置

        注意:指令的名称必须是全小写,不能大写

    1. <body>
    2. <div id="app">
    3. <p v-text="msg">p>
    4. <p v-upper="msg">p>
    5. div>
    6. <div id="app1">
    7. <p v-text="msg">p>
    8. <p v-upper="msg">p>
    9. div>
    10. <script src="../js/vue.js">script>
    11. <script>
    12. // 定义全局指令
    13. // 指令名不带v- 并且指令名必须全小写
    14. // Vue.directive('upper', (node, bindings) => {
    15. // // console.log(node,bindings);
    16. // // 获取到元素和元素所绑定的数据
    17. // // 手动给元素的内容改成大写
    18. // node.textContent = bindings.value.toUpperCase()
    19. // })
    20. new Vue({
    21. el: '#app',
    22. data: {
    23. msg: 'i love you~'
    24. },
    25. directives: {
    26. upper: (node, bindings) => {
    27. // console.log(node,bindings);
    28. // 获取到元素和元素所绑定的数据
    29. // 手动给元素的内容改成大写
    30. node.textContent = bindings.value.toUpperCase()
    31. }
    32. }
    33. })
    34. new Vue({
    35. el: '#app1',
    36. data: {
    37. msg: 'i love you~'
    38. }
    39. })
    40. script>
    41. body>

    自定义插件

        插件的作用:
            定义插件函数或者对象,为Vue和Vue的实例添加一些额外功能

        插件必须声明使用  Vue.use()

        (function( w) {

        })( window );

        声明使用插件,所有的官方插件都要声明使用
        本质:
        如果是函数式插件就是直接调用这个函数
        如果是对象式插件,那么就找到对象的install方法去调用

    1. <body>
    2. <div id="app">
    3. <p v-upper="msg">p>
    4. div>
    5. <script src="../js/vue.js">script>
    6. <script src="../js/myplugin.js">script>
    7. <script>
    8. console.log(MyPlugin); //插件已经被放在window对象身上
    9. Vue.use(MyPlugin)
    10. Vue.myGlobalMethod()
    11. let vm = new Vue({
    12. el:"#app",
    13. data(){
    14. return {
    15. msg:'aaaa'
    16. }
    17. }
    18. })
    19. vm.$myMethod()
    20. script>
    21. body>

    自定义组件(非单文件组件)

        什么是组件: (js css html xml img 字体图标  svg 等)     代码和资源的集合叫组件
        什么是组件化: 针对项目来说  这个项目由多个组件构成 就称这个项目是组件化的项目
        什么是模块: 一个js文件(一个模块不单单可以是js文件)
        什么是模块化: 这个项目由多个模块构成 就称这个项目是模块化的项目


        vue和react都是去做单页应用的,单页应用一般肯定都是组件化的    

    1. <body>
    2. <div id="app">
    3. <mybutton>mybutton>
    4. <mybutton>mybutton>
    5. <mybutton>mybutton>
    6. <mybutton>mybutton>
    7. <mybutton>mybutton>
    8. div>
    9. <script src="../js/vue.js">script>
    10. <script>
    11. // 组件的使用就是三大步:
    12. // 1、定义
    13. // 定义一个组件本质是定义了一个函数,函数后期是当构造函数用的
    14. let VueComponent = Vue.extend({
    15. // 配置对象,这个配置对象和vue的配置对象几乎一样,除了没有el以外
    16. data(){
    17. // 面试题:为什么组件当中data必须是函数,不能写对象
    18. return {
    19. count:0
    20. }
    21. },
    22. // data:{
    23. // count:0
    24. // },
    25. template:'

      我爱你赵丽颖

      '
    26. })
    27. // 2、注册(全局注册和局部注册)
    28. // 注册的本质其实是把一个名字和定义生成的函数进行绑定
    29. // 全局注册
    30. // Vue.component('mybutton',VueComponent)
    31. // 3、使用
    32. // 直接写标签,标签名就是你注册的名字
    33. new Vue({
    34. el:'#app',
    35. // 局部注册组件
    36. components:{
    37. mybutton:VueComponent
    38. },
    39. data(){
    40. return {
    41. // count:0
    42. }
    43. }
    44. })
    45. script>
    46. body>

    简化:

    1. <body>
    2. <div id="app">
    3. <mybutton>mybutton>
    4. <mybutton>mybutton>
    5. <mybutton>mybutton>
    6. <mybutton>mybutton>
    7. <mybutton>mybutton>
    8. div>
    9. <script src="../js/vue.js">script>
    10. <script src="./mybutton.js">script>
    11. <script>
    12. // 下面这个写法是简写
    13. // 这里虽然不用extend生成函数,但是会把配置对象作为第二个参数,本质在函数Vue.component内部
    14. // 还是要先用extend把第二个参数作为配置对象生成函数的,再用生成的函数和第一个参数进行绑定
    15. // 全局定义并注册
    16. // Vue.component('mybutton',{
    17. // // 配置对象,这个配置对象和vue的配置对象几乎一样,除了没有el以外
    18. // data(){
    19. // return {
    20. // count:0
    21. // }
    22. // },
    23. // // data:{
    24. // // count:0
    25. // // },
    26. // template:'

      我爱你赵丽颖

      '
    27. // })
    28. // Vue.component('mybutton',mybutton)
    29. // 3、使用
    30. // 直接写标签,标签名就是你注册的名字
    31. new Vue({
    32. el: '#app',
    33. // 局部定义并注册组件
    34. components: {
    35. mybutton
    36. },
    37. data() {
    38. return {
    39. // count:0
    40. }
    41. }
    42. })
    43. script>
    44. body>

    mybutton.js

    1. (function(w){
    2. w.mybutton = {
    3. // 配置对象,这个配置对象和vue的配置对象几乎一样,除了没有el以外
    4. data(){
    5. return {
    6. count:0
    7. }
    8. },
    9. // data:{
    10. // count:0
    11. // },
    12. template:'

      我爱你赵丽颖

      '
    13. }
    14. })(window);

        缺点:
            这样定义组件麻烦、模板没提示
            样式没法单独搞,
            没法使用模块化解析ES6语法

        后期我们都是约定成俗(习惯性)把一个.vue文件称作是一个组件,但是本质上它只是暴露了一个配置对象
        配置对象必须在Vue.component()之后,才能定义并注册成为一个组件,接着才能写标签使用

    为什么组件当中data必须是函数,不能写对象 

     如果写对象,由于配置对象是同一个,如果组件复用,实例化出来的组件对象里的数据用的是同一个data,

    使用函数,每个组件都有自己的数据,每次实例化一个对象,都会调一次函数,调用函数时,会return一个新的对象

  • 相关阅读:
    Python3.7源码编译
    POJ1330最近公共祖先LCA
    直播课堂系统08-腾讯云对象存储和课程分类管理
    CSS accent-color + 自己封装 radio
    【开源】基于JAVA的社区买菜系统
    python-数据可视化(总)
    Windows库程序
    哈希算法(二)哈希算法与一致性哈希算法
    ssh 免密码登录
    Spring Cloud Loadbalancer
  • 原文地址:https://blog.csdn.net/m0_60376759/article/details/125898075