学习vue笔记(2)

目录

VUE.set的使用

vue监测数组原理

总结vue检测数组

收集表单数据

过滤器

v-text指令

v-html指令

v-cloak&v-once&v-pre属性

自定义属性

自定义全局属性

生命周期

生命周期之挂载

生命周期之更新

生命周期之销毁

生命周期之总结

组件

非单文件组件

几个注意点

组件的嵌套

VueComponent组件实例对象

单文件组件


VUE.set的使用 

 

vue监测数组原理

 

 总结vue检测数组

 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h1>学生信息</h1>
        <button @click="student.age++">年龄+1</button><br />
        <button @click="addSex">添加性别属性,默认值:男</button><br />
        <button @click="student.sex='未知'">修改性别</button><br />
        <button @click="addFriends">在列表首位添加一个朋友</button><br />
        <button @click="updateFirstFriendName">修改第一个朋友的名字为:张三</button><br />
        <button @click="addHobby">添加一个爱好</button><br />
        <button @click='updateHobby'>修改第一个爱好为:开车</button><br />
        <button @click="removePlay"> 过滤掉玩游戏</button>
        <h3>姓名:{{ student.name}}</h3>
        <h3>年龄:{{student.age}}</h3>
        <h3 v-if="student.sex">性别:{{student.sex}}</h3>
        <h3>爱好:</h3>
        <ul>
            <li v-for="(h,index) in student.hobby" :key="index">{{h}}</li>
        </ul>
        <h3>朋友们:</h3>
        <ul>
            <li v-for="(f,index) in student.friends" :key="index">
                {{f.name}}---{{f.age}}
            </li>
        </ul>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
        const vm = new Vue({
            el: "#root",
            data: {
                student: {
                    name: '小麦',
                    age: 12,
                    hobby: ['看书', '踢足球', '玩游戏'],
                    friends: [
                        { name: 'haha', age: 13 },
                        { name: 'xixi', age: 14 }
                    ]
                }
            },
            methods: {
                addSex() {
                    Vue.set(this.student, 'sex', '男')
                    // this.$set(this.student, 'sex', '男')
                },
                addFriends() {
                    this.student.friends.unshift({ name: 'jack', age: 10 })
                },
                updateFirstFriendName() {
                    this.student.friends[0].name = 'nini'
                    this.student.friends[0].age = 102
                },
                addHobby() {
                    this.student.hobby.push('学习')
                },
                updateHobby() {
                    // this.student.hobby.splice(0, 1, '开车')
                    Vue.set(this.student.hobby, 0, '开车')
                    this.$set(this.student.hobby, 0, '开车')
                },
                removePlay() {
                    this.student.hobby = this.student.hobby.filter((h) => {
                        return h !== '玩游戏'
                    })
                }
            }
        })
    </script>
</body>
</html>

 收集表单数据

 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <form @submit.prevent="demo">
            <label for="demo">账号:</label>
            <input type="text" id="demo" v-model.trim="account"><br /><br />
            密码:<input type="password" v-model="password"><br /><br />
            年龄:<input type="number" v-model.number="age"><br />
            性别:
            男:<input type="radio" name="sex" v-model="sex" value="man">
            女:<input type="radio" name="sex" v-model="sex" value="woman"><br /><br />
            爱好:
            学习<input type="checkbox" v-model="hobby" value="study">
            打游戏<input type="checkbox" v-model="hobby" value="play"><br /><br />
            所属校区:
            <select name="" id="" v-model="city">
                <option value="">请选择校区</option>
                <option value="beijing">北京</option>
                <option value="shanghai">上海</option>
                <option value="shenzhen">深圳</option>
            </select><br /><br />
            其他信息
            <textarea v-model.lazy="other "></textarea><br /><br />
            <input type="checkbox" v-model="agree">
            阅读并接受
            <a href="#">用户协议</a><br />
            <button>提交</button>
        </form>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
        new Vue({
            el: '#root',
            data: {
                account: '',
                password: '',
                sex: '',
                hobby: [],
                city: '',
                other: '',
                agree: '',
                age: 18
            },
            methods: {
                demo() {
                    alert(1)
                }
            }
        })
    </script>
</body>
</html>

过滤器

 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <script type="text/javascript" src="../js/dayjs.min.js"></script>
</head>
<body>
    <div id="root">
        <h2>像是格式化后的时间</h2>
        <!-- 计算 属性实现-->
        <h3> 现在是{{fmtTime}}</h3>
        <!-- methods实现 -->
        <h3>现在是{{getFmtTime()}}</h3>
        <!-- 过滤器实现 -->
        <h3>现在是{{time | timeFormater}}</h3>
        <!-- 过滤器实现传参 -->
        <h3>现在是{{time | timeFormater('YYYY MM DD') | mySlice}}</h3>
    </div>
    <div id="root2">
        <h3>{{msg |mySlice}}</h3>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
        //全局过滤,写在最前面
        Vue.filter('mySlice', function (value) {
            return value.slice(0, 4)
        })
        new Vue({
            el: '#root',
            data: {
                time: 1621561377603
            },
            computed: {
                fmtTime() {
                    return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
                }
            },
            methods: {
                getFmtTime() {
                    return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
                }
            },
            //局部过滤
            filters: {
                timeFormater(value, str) {
                    // console.log('@', value)
                    return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
                    return dayjs(value).format(str)
                },
                mySlice(value) {
                    return value.slice(0, 4)
                }
            }
        })
        new Vue({
            el: '#root2',
            data: {
                msg: 'hello,atguigu'
            }
        })
    </script>
</body>
</html>

v-text指令

 

v-html指令

 

 

v-cloak&v-once&v-pre属性

v-cloak

 v-pre

  v-once

 

自定义属性

自定义属性(big)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>{{name}}</h2>
        <h2>当前的n值是:<span v-text="n"></span></h2>
        <h2>放大十倍后的n值<span v-big="n"></span></h2>
        <button @click="n++">
            点我加一
        </button>
        <hr />
        <input type="text" v-fbind:value="n">
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
        new Vue({
            el: '#root',
            data: {
                name: 'atguigu',
                n: 1
            },
            directives: {
                big(element, binding) {
                    element.innerText = binding.value * 10
                },
                // fbind(element,binding){
                //     element.value =binding.value
                // }
                //fbind不要写成一个函数了,不然只有两种情况被调用
                // (1)指令与元素成功绑定时(一上来)
                // (2)指令所在的模板被重新解析时
                // 所以写成对象
                fbind: {
                    //指令与元素成功绑定
                    bind(element, binding) {
                        console.log('bind')
                        element.innerText = binding.value
                    },
                    //指令所在元素被插入页面时
                    inserted(element, binding) {
                        console.log('inserted')
                        element.focus()
                    },
                    // 指令所在的模板被重新解析时
                    update(element, binding) {
                        console.log('update')
                        element.value = binding.value
                        element.focus()
                    }
                }
            }
        })
    </script>
</body>
</html>

自定义全局属性

 

 

生命周期

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2 :style="{opacity}">欢迎学习vue</h2>
    </div>
    <script type="text/javascript">
        Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
        const vm = new Vue({
            el: '#root',
            data: {
                opacity: 1
            },
            methods: {
            },
            //vue完成模板的解析,并把真实的DOM元素放入页面后(挂载完毕)调用mounted
            mounted() {
                setInterval(() => {
                    vm.opacity -= 0.01
                    if (vm.opacity <= 0) vm.opacity = 1
                }, 16)
            }
        })
        // // 通过外界定时器
        // setInterval(() => {
        //     vm.opacity -= 0.01
        //     if (vm.opacity <= 0) vm.opacity = 1
        // }, 16)
    </script>
</body>
</html>

生命周期之挂载

 

beforeCreate()

created()

beforeMount()

mounted()

生命周期之更新

 

生命周期之销毁

 

生命周期之总结

组件

 

 

                非单文件组件

 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <hello></hello>
        <h2>{{msg}}</h2>
        <hr>
        <!-- 第三步编写组件标签 -->
        <school></school>
        <hr>
        <student></student>
    </div>
    <div id="root2">
        <hello></hello>
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
    //第一步: 创建school组件
    const school = Vue.extend({
        // 一定不要写el配置项
        // 组件必须用data的函数式
        template: `
        <div>
             <h2>学校名称 :{{schoolName}}</h2>
        <h2>学校地址: {{address}}</h2>
        <button @click="showName">点我提示学校名</button>
            </div>
        `,
        data() {
            return {
                schoolName: '尚硅谷',
                address: 'beijing'
            }
        },
        methods: {
            showName() {
                alert(this.schoolName)
            }
        }
    })
    // 第一步:创建student组件
    const student = Vue.extend({
        template: `
        <div>
             <h2>学生姓名:{{studentName}}</h2>
        <h2>学生年龄:{{age}}</h2>
            </div>
        `,
        data() {
            return {
                studentName: '张三',
                age: 18
            }
        }
    })
    // 第一步:创建hello组件
    const hello = Vue.extend({
        template: `
        <div>
            <h2>nihao{{name}}</h2>
            </div>
        `,
        data() {
            return {
                name: 'alice'
            }
        }
    })
    // 第二部:全局注册组件
    Vue.component('hello', hello)
    // 创建vm
    new Vue({
        el: '#root',
        data: {
            msg: '你好啊'
        },
        //第二部:注册组件(局部注册)
        components: {
            school,
            student
        }
    })
    new Vue({
        el: '#root2',
    })
// 创建vm
    // new Vue({
    //     el: '#root',
    //     data: {
    //         schoolName: '尚硅谷',
    //         address: 'beijing',
    //         studentName: '张三',
    //         age: 18
    //     }
    // })
</script>
</html>

几个注意点

 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h1>{{msg}}</h1>
        <!-- 两种写法 -->
        <school></school>
        <school />
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
    //定义组件
    // const s = Vue.extend({
        // 简写
    const s = {
        // 开发者工具看这个名
        name: 'atguihu',
        template: `
    <div>
    <h2>学校名称:{{name}}</h2>
    <h2>学校地址:{{address}}</h2>
    </div>
    `,
        data() {
            return {
                name: '少硅谷',
                address: 'beijing'
            }
        }
    }
    new Vue({
        el: '#root',
        data: {
            msg: 'huanyig'
        },
        //注册的时候用什么名,用标签用什么名
        components: {
            school: s
        }
    })
</script>
</html>

 

组件的嵌套

Vue>app>school>student

                >hello


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
    </div>
</body>
<script type="text/javascript">
    Vue.config.productionTip = false//设置为 false 以阻止 vue 在启动时生成生产提示
    // 定义student组件
    const student = {
        name: 'student',
        template: `
    <div>
    <h2>学生名称:{{name}}</h2>
    <h2>学生年龄:{{age}}</h2>
    </div>
    `,
        data() {
            return {
                name: '哈哈哈',
                age: 18
            }
        }
    }
    //    定义sxhool组件
    const school = Vue.extend({
        name: 'school',
        template: `
    <div>
    <h2>学校名称:{{name}}</h2>
    <h2>学校地址:{{address}}</h2>
    <student></student>
    </div>
    `,
        data() {
            return {
                name: '少硅谷',
                address: 'beijing'
            }
        },
        components: {
            student
        }
    })
    const hello = Vue.extend({
        template: `<div> <h1>{{msg}}</h1>  <div>`,
        data() {
            return {
                msg: '欢迎你ya'
            }
        }
    })
    const app = Vue.extend({
        template: `
    <div>
        <school></school>
        <hello></hello>
        </div>
    `,
        components: {
            school,
            hello
        }
    })
    // 创建vue
    new Vue({
        template: '<app></app>',
        el: '#root',
        components: {
            app
        }
    })
</script>
</html>

VueComponent组件实例对象

 

 

单文件组件

暴露有单个暴露,统一暴露,默认暴露

2

3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值