Vue_生命周期_定时任务和延迟任务_swiper_自定义组件的封装_自定义指令_过滤器_单文件组件_vue-cli介绍

Vue 入门

1. 生命周期

1. mounted(挂载 用的最多)
	向后端发送请求,定时器初始化

2. destroyed(销毁)
	组件销毁 => 给组件写一个定时器 => 组件销毁,定时器清除
//示例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>Title</title>
</head>
<body>

<div id="box">
    <child v-if="isShow"></child>

    {{name}}

</div>

</body>
<script>

    Vue.component('child', {
        template: `
        <div>我是组件的div</div>`,
        data(){
            return {
                t:null,
            }
        },
        beforeCreate() {
            console.log('beforeCreate')
        },
        created() {
            console.log('created')
        },
        beforeMount() {
            console.log('beforeMount')
        },
        mounted() {
            //用的最多,向后端加载数据,创建定时器等
            console.log("页面已被vue实例渲染, data, methods已更新");
            console.log('mounted')
            //起一个定时器,每隔三秒,打印一行
            this.t = setInterval(function () {
                console.log('daada')
            }, 3000)
        },
        beforeUpdate() {
            console.log('beforeUpdate')
        },
        updated() {
            console.log('updated')
        },
        beforeDestroy() {
            console.log('beforeDestroy')
        },
        destroyed() {
            //组件销毁,清理定时器
            clearInterval(this.t)
            this.t = null
            console.log('destroyed')
        },
    })

    var vm = new Vue({
        el: '#box',
        data: {
            name:'lqz',
            isShow:true
        },
        beforeUpdate() {
            console.log('根的---beforeUpdate')
        },
        updated() {
            console.log('根的---updated')
        },

    })

</script>
</html>

2. 定时任务和延迟任务

setTimeout(function () {
    	alert(333)
    },3000
) //延迟3s钟干什么事

setInterval(
    function () {
    	alert(444)
	},3000
)//每隔3s钟干什么事

3. swiper学习

# vue中的钩子函数
	monunted 和 updated
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>

    <link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css">
    <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>

    <title>Title</title>
    <style>
        .swiper-container {
            width: 60%;
            height: 600px;
        }
    </style>
</head>
<body>

<div id="box">

    <div class="swiper-container">
        <div class="swiper-wrapper">
            <div class="swiper-slide" v-for="data in datalist">
                <img :src="data" alt="">

            </div>
        </div>
        <!-- 如果需要分页器 -->
        <div class="swiper-pagination"></div>

        <!-- 如果需要导航按钮 -->
        <div class="swiper-button-prev"></div>
        <div class="swiper-button-next"></div>

    </div>
</div>

</body>
<script>

    var vm = new Vue({
        el: '#box',
        data: {
            datalist: []
        },
        mounted() {
            //大坑
            setTimeout(() => {
                //this指的是function这个函数
                //使用了箭头函数以后,this指的是上一层
                this.datalist = ['https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1608145297276&di=dd396caeaa0bb6a2a50609a109cd3120&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2Fattachments2%2Fday_110915%2F1109151356c0717d7e6a91e985.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1608145297276&di=dd396caeaa0bb6a2a50609a109cd3120&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2Fattachments2%2Fday_110915%2F1109151356c0717d7e6a91e985.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1608145297276&di=dd396caeaa0bb6a2a50609a109cd3120&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2Fattachments2%2Fday_110915%2F1109151356c0717d7e6a91e985.jpg']
            }, 3000)

        },
        updated() {
            //只要js数据发生变化,组件就会执行updated方法,轮播图又会重新创建
            var mySwiper = new Swiper('.swiper-container', {
                // direction: 'vertical', // 垂直切换选项
                loop: true, // 循环模式选项

                // 如果需要分页器
                pagination: {
                    el: '.swiper-pagination',
                },

                // 如果需要前进后退按钮
                navigation: {
                    nextEl: '.swiper-button-next',
                    prevEl: '.swiper-button-prev',
                },
            })
        },
    })

</script>
</html>

4. 自定义组件的封装

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css">
    <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
    <title>Title</title>
    <style>
        .swiper-container {
            width: 60%;
            height: 600px;
        }
    </style>
</head>
<body>

<div id="box">

    <swipper>
        <div class="swiper-wrapper">
                <div class="swiper-slide" v-for="data in datalist">
                    <img :src="data" alt="">

                </div>
            </div>
    </swipper>

    <hr>
    <hr>
    <br>
    <swipper :key="datalist2.length">
        <div class="swiper-wrapper">
                <div class="swiper-slide" v-for="data in datalist2">
                    {{data}}

                </div>
            </div>
    </swipper>
</div>

</body>
<script>

    Vue.component('swipper',{
        template:`
         <div class="swiper-container">

            <slot></slot>
            <div class="swiper-pagination"></div>
            <div class="swiper-button-prev"></div>
            <div class="swiper-button-next"></div>

        </div>
        `,
        mounted() {
            var mySwiper = new Swiper('.swiper-container', {
                // 垂直切换选项
                // direction: 'vertical', 
                
                // 循环模式选项
                loop: true, 

                // 如果需要分页器
                pagination: {
                    el: '.swiper-pagination',
                },

                // 如果需要前进后退按钮
                navigation: {
                    nextEl: '.swiper-button-next',
                    prevEl: '.swiper-button-prev',
                },
            })
        }
        // updated() {
        //     //每次更新都会执行该代码,会耗费资源
        //     var mySwiper = new Swiper('.swiper-container', {
        //         // direction: 'vertical', // 垂直切换选项
        //         loop: true, // 循环模式选项
        //
        //         // 如果需要分页器
        //         pagination: {
        //             el: '.swiper-pagination',
        //         },
        //
        //         // 如果需要前进后退按钮
        //         navigation: {
        //             nextEl: '.swiper-button-next',
        //             prevEl: '.swiper-button-prev',
        //         },
        //     })
        // },
    })
    var vm = new Vue({
        el: '#box',
        data: {
            datalist: [],
            datalist2: []
        },
        mounted() {
            //大坑
            setTimeout(() => {
                //this指的是function这个函数
                //使用了箭头函数以后,this指的是上一层
                this.datalist = ['https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1608145297276&di=dd396caeaa0bb6a2a50609a109cd3120&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2Fattachments2%2Fday_110915%2F1109151356c0717d7e6a91e985.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1608145297276&di=dd396caeaa0bb6a2a50609a109cd3120&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2Fattachments2%2Fday_110915%2F1109151356c0717d7e6a91e985.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1608145297276&di=dd396caeaa0bb6a2a50609a109cd3120&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2Fattachments2%2Fday_110915%2F1109151356c0717d7e6a91e985.jpg']
                this.datalist2 = ['111','222','333','5555']
            }, 3000)
        },
        updated() {
            //只要js数据发生变化,组件就会执行updated方法,轮播图又会重新创建
        },
    })

</script>
</html>

5. 自定义指令

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <title>Title</title>
</head>
<body>

<div id="box">

    <!--    <div v-mystyle> 我是div</div>-->
    <!--    <p v-mystyle> 0pppp</p>-->
    <!--    <p > sfasfsdafsd </p>-->

    <div v-mystyle="'green'"> 我是div</div>
    <div v-mystyle="'red'"> 我是div</div>

    <div v-mystyle="color"> 我是div</div>

</div>

</body>
<script>
    //自定义指令,不需要写v使用的时候,加上v-名字

    // Vue.directive('mystyle', {
    //     inserted() {  //在标签上使用这个指令,就会触发inserted的执行
    //         console.log('我执行了')
    //     },
    // })
    //只要使用了我的指令,背景就变红色
    // Vue.directive('mystyle', {
    //     inserted(ev) {  //ev就是dom对象
    //         ev.style.background='red'
    //     },
    // })

    //只要使用了我的指令,背景就变成我传入的颜色
    Vue.directive('mystyle', {
        inserted(ev, color) {  //ev就是dom对象
            console.log(ev)
            console.log(color.value)
            ev.style.background = color.value
        },
        update(el, input) {
            el.style.background = input.value

        }
    })

    var vm = new Vue({
        el: '#box',
        data: {
            color: 'red'
        },
    })

</script>
</html>

6. 过滤器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="js/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <title>Title</title>
</head>
<body>

<div id="box">
    <ul>
        <li v-for="item in datalist">
            <h2>{{item.nm}}</h2>
            <p>主演是:{{item.star}}</p>
            <!--        <img :src="geturl(item.img)" alt="">-->
            <img :src="item.img | repUrl" alt="">

        </li>
    </ul>
</div>

</body>
<script>

    Vue.filter('repUrl', function (url) {
        return url.replace('w.h', '128.180')
    })
    var vm = new Vue({
        el: '#box',
        data: {
            datalist: null
        },
        methods: {
            geturl(url) {
                return url.replace('w.h', '129.180')
            }
        },
        mounted() {
            axios.get("http://127.0.0.1:5000/").then(res => {
                console.log(res.data)
                this.datalist = res.data.coming
            }).catch(err => {
                console.log(err);
            })
        }
    })

</script>
</html>

7. 单文件组件

# 原来写的组件存在的问题
    1. 全局定义 (Global definitions) 
    	强制要求每个 component 中的命名不得重复
        
    2. 字符串模板 (String templates) 
    	缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \
        
    3. 不支持 CSS (No CSS support) 
    	意味着当 HTML 和 JavaScript 组件化时,CSS 明显被遗漏
        
    4. 没有构建步骤 (No build step) 
    	限制只能使用 HTML 和 ES5 JavaScript,而不能使用预处理器
        如 Pug (formerly Jade) 和 Babel
    
# 以后每个组件就是一个 xx.vue => 最终 => html,css,js
	并且还可以使用 webpack 构建工具
    
# CLI 会为你搞定大多数工具的配置问题
Vue_生命周期_定时任务和延迟任务_swiper_自定义组件的封装_自定义指令_过滤器_单文件组件_vue-cli介绍

8. vue-cli

1. vue-cli 安装

1. 安装node,官网下载,一路下一步 => node,npm

2. 淘宝镜像(cnpm,)npm install -g cnpm --registry=https://registry.npm.taobao.org
   装完以后,本地就有cnpm命令,以后再装模块,就使用cnpm安装
   cnpm install -g @vue/cli    # -g 全局安装

3. 装完以后就会走vue命令

4. 通过vue命令创建项目
	1. vue create 项目名(命令行下创建项目)
    	
    2. vue ui (图形化界面,点点点创建项目)
    	点一点就会(bable,eslint)
        
    注意:
    	新建的这些项目的本质是:cli从git上给你拉了一个空项目(模板),以后再模板上继续写就可以了
5. 注意
    vue:   2.x
    bable: 兼容性相关(es6的语法,自动转成es5兼容浏览器)
    eslint:语法检查,代码格式化
    
6. 运行项目
	npm run serve: 在浏览器中访问
        
7. 使用ide打开编写
	pycharm打开  

2. 项目目录介绍

dist: 
    打包的项目目录(打包后会生成)
    
node_modules: 
    项目依赖(删掉,不上传git,使用npm install重新安装)
    
public: 共用资源
	--favicon.ico
	--index.html: 项目入口页面,单页面开发
        
src: 项目目标,书写代码的地方
	-- assets:资源,静态图片
	-- components:组件(swiper组件...)
	-- views:视图组件(也是组件)
	-- App.vue:根组件
	-- main.js: 入口js
	-- router.js: 路由文件
	-- store.js: 状态库文件
        
vue.config.js: 
    项目配置文件(没有可以自己新建)
    
package.json:
	项目配置依赖(等同于python项目的reqirement.txt)
"scripts": {
  "serve": "vue-cli-service serve",   npm run serve   运行项目
  "build": "vue-cli-service build",   npm run build   构建项目 => html,css,js
  "lint": "vue-cli-service lint"      npm run lint    格式化代码
}
上一篇:javaFile循环列出指定目录下的所有文件(源代码)


下一篇:swiper 强大的滚动插件