Vue day01

<!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>1:初识 Vue</title>
</head>

<body>
    <!-- 设置一个模板 template -->
    <div id="app">
        <!-- 
            Vue 基本语法的入门部分最重要的是两个
            1:插值语法
                又被称之为大胡子表达式 格式如下
                <tagName>{{ 初始化的数据 }}</tagName>{{ 初始化的数据 }}
                只能使用在标签外,由于是表达式所以没有什么业务逻辑,无迭代也没有
                流程控制等,仅仅可以简单的显示数据
        -->
        {{ content }}
        {{ count/10 }}
        {{ flag?'IOS':'Android' }}
        {{ text.split('.').reverse().join('@') }}
        {{ info.address }}
        {{ info['address'] }}
        <!-- 大胡子表达式无法显示 null undefined -->
        {{ val1 }}{{ val2 }}
        <!-- 
            2:指令语法
                只能使用在标签上,格式为 v-指令名="绑定的数据"
                非强制绑定数据,存在多种书写格式

                v-html:向元素中插入超文本,支持标签,其实就是
                js 中的 innerHTML
                v-text:向元素中插入文本,不支持标签,仅仅支持文本
                就是 js 中的 innerText
        -->
        <p style="background-color: lightblue;" v-html="myHtml"></p>
        <p style="background-color: lightblue;" v-text="myHtml"></p>
        <!-- v-once:一次性插值绑定,单向绑定是一次性的,之后
        没有单向绑定功能,数据无响应式 -->
        <p v-once>{{ count }}</p>
        <!-- v-model:只能使用在表单项中,自带双向绑定功能 -->
        <input type="text" v-model="myValue">
        <!-- 
            v-bind:绑定元素的属性 
                <tagName v-bind:属性名="初始化的值" />
            语法糖:
                <tagName :属性名="初始化的值" />
        -->
        <img :src="mySrc" :style="myStyle" :title="myTitle">
        <!-- 
            v-on:绑定元素的动作
                <tagName v-on:事件="函数" />
                注意这里函数如果没有参数,不书写括号
            语法糖:
                <tagName @事件="函数" />
                事件与 js 类型,但是没有 on 前缀
        -->
        <button @click="add">{{ count }}</button>
        <input type="text" v-model="count" :style="myCss">
    </div>
    <!-- 如果书写在模板外,则 Vue 实例无法管理,因此无法编译 -->
    {{ content }}
    <!-- 引入 Vue 依赖 -->
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        /* 通过 Vue 依赖提供的构造器,创建一个 Vue 实例 */
        const vm = new Vue({
            /* 以下所有的参数都是属性名:属性值的格式,
            这种配置方式,称之为 OptionsAPI 中文翻译作 配置项式 API
            这是 Vue2 的特色 */
            /* el:element的简写,表示控制的模板 */
            el: '#app',
            /* data:用来封装初始化的数据,这里初始化的数据全部
            封装在 Vue 实例对象的表层,可以在模板中直接使用 */
            data: {
                content: '灌篮高手就要首映了!!',
                count: 100,
                flag: true,
                text: '123.456.789',
                info: {
                    address: ['超然楼', '解放阁', '七星台'],
                },
                val1: null,
                val2: undefined,
                myHtml: '<em style="color:red">本周末不见不散!</em>',
                myValue: '',
                mySrc: './assets/logo.png',
                myTitle: '渐进式 JavaScript 框架',
                myStyle: 'width:100px',
                myCss: 'background-color:rgb(255,0,255)',
            },
            /* beforeMount() {
                debugger
            }, */
            /* methods:用来设置函数 */
            methods: {
                /* 设置函数 */
                add() {
                    /* this:如果书写在 Vue 实例中,则
                    this表示本实例,这里就是 vm,通过 this
                    可以获取所有配置项中的数据 */
                    this.count++
                    let r = Math.floor(Math.random() * 256)
                    let g = Math.floor(Math.random() * 256)
                    let b = Math.floor(Math.random() * 256)
                    this.myCss = `background-color:rgb(${r},${g},${b})`
                },
            },
        })  

        /* 通过 vm 可以直接获取初始化的数据,因为他们
        都被封装在表层,通过 $el 可以获取 Vue 实例管理的
        模板范围 */
        console.log(vm,vm.content,vm.info.address,
        vm.$el)
        /* 
            Vue 实例是如何工作的(简化版,无生命周期,省略
            百分之 90 的内容) 
                浏览器从上往下解析,当解析到插值语法和
                指令语法时,浏览器不进行任何的解析工作,因为
                浏览器只能识别 html css js,这些插值语法
                和指令语法就直接显示在页面上,数据没有挂载,这种
                状态称之为虚拟 DOM
                之后 Vue 实例根据模板范围开始解析模板,将初始化的
                数据全部挂载到模板中,此时插值语法被填充,指令语法
                被解析,最终生成的是真实 DOM,真实 DOM 会覆盖之前的
                虚拟 DOM,最终用户看到的就是真实 DOM
        
        */

    </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>2:样式渲染</title>
    <style>
        .box1{
            background-color: pink;
        }
        .box2{
            background-color: aqua;
        }
        .box3{
            background-color: palevioletred;
        }
        .box4{
            background-color: silver;
        }
        .box5{
            color:hotpink;
        }
    </style>
</head>
<body>
    <div id="app">
        <!-- 使用 Vue 来渲染样式存在以下两个思路
            1:绑定 class
            2:绑定 style
            -----------------
            1.1:<tagName :class="初始化的值" />
        -->
        <p :class="test1">1.1:绑定 class 后面是字符串</p>
        <!-- 
            1.2:<tagName :class="{类名:初始化的值,类名:初始化的值,}" /> 
            如果初始化的值为真,则类名存在,为假,则类名不存在
        -->
        <p :class="{box2:val2,box3:val3}">1.2:绑定 class 后面是对象</p>
        <!-- 
            1.3:<tagName :class="['类名','类名','类名']" />
        -->
        <p :class="['box4','box5']">1.3:绑定 class 后面是数组</p>
        <!-- 
            2.1:<tagName :style="初始化的值" /> 
        -->
        <p :style="value1">2.1:绑定 style,后面是字符串</p>
        <!-- 
            2.2:<tagName :style="{样式名:样式值,样式名:样式值}" >
            样式名:必须是小驼峰格式
        -->
        <p :style="{backgroundColor:value2,color:value3}">2.2:绑定 style,后面是对象</p>
    
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                test1:'box1',
                val2:false,
                val3:1,
                value1:'background-color:crimson',
                value2:'aqua',
                value3:'gray',
            },
        })
    </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>3:函数计算属性侦听器</title>
</head>
<body>
    <div id="app">
        <!-- 如果可以转换为 number,则进行转换,如果无法转换
        则不转换 -->
        前端成绩: <input type="text" v-model.number="frontEndScore"> <br>
        后端成绩: <input type="text" v-model.number="backEndScore"> <br>
        <hr>
        <!-- 前面说过,函数如果没有实参,则没有括号,但是这里书写括号
        是因为这里没有绑定事件,直接被调用 -->
        总成绩(函数-单向绑定):{{ sumScore() }} <br>
        总成绩(函数-单向绑定): <input type="text" 
        v-model="sumScore()"> <br>
        <!-- 计算属性没有括号,不会用来传值,计算属性就是一个
        属性而已 -->
        总成绩(计算属性-单向绑定):{{ totalScore }} <br>
        总成绩(计算属性-单向绑定): <input type="text" 
        v-model="totalScore"> <br>
        <!-- lazy:点击回车才可以激发绑定功能 -->
        总成绩(计算属性-单双向绑定): <input type="text"
        v-model.number.lazy="totalScores"> <br>

        总成绩(侦听器): <input type="text" 
        v-model="totalWatch"> <br>
    </div> 
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        const vm = new Vue({
            el:'#app',
            data:{
                frontEndScore:90,
                backEndScore:80,
                totalWatch:0,
            },
            /* 设置函数 */
            methods: {
                sumScore(){
                    //return +this.frontEndScore + (+this.backEndScore)
                    //return this.frontEndScore-0 + (this.backEndScore-0)
                    console.log('我是函数 sumScore-------')
                    return this.frontEndScore + this.backEndScore 
                },
            },
            /* 设置计算属性 */
            computed:{
                /* 单向绑定 */
                totalScore(){
                    console.log('我是计算属性 totalScore-------')
                    return this.frontEndScore + this.backEndScore 
                },
                /* 单双向绑定 */
                totalScores:{
                    /* 单向绑定 */
                    get(){
                        return this.frontEndScore + this.backEndScore
                    },
                    /* 双向绑定 这里的形参就是主动输入的总成绩的值 */
                    set(newVal){
                        let avgScore = newVal/2
                        this.backEndScore = avgScore
                        this.frontEndScore = avgScore
                    },
                },
            },
            /* 设置侦听器 */
            watch:{
                /* 设置侦听的数据,这里侦听前端成绩 */
                frontEndScore:{
                    /* 自动执行一次侦听器 */
                    immediate:true,
                    /* 
                        newVal:形参,表示更改后的数据
                        oldVal:形参,表示更改前的数据
                    */
                    handler(newVal,oldVal){
                        /* 总成绩 = 新的前端成绩加上后端成绩  */
                        this.totalWatch = 
                        newVal + this.backEndScore
                    },
                },
            },
        })

        /* 此处侦听后端成绩 */
        vm.$watch('backEndScore',{
            /* 开启深度侦听 */
            deep:true,
            immediate:true,
            handler(newVal,oldVal){
                this.totalWatch =
                newVal + this.frontEndScore
            }
        })

    </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>4:条件渲染</title>
    <style>
        .box{
            width:100px;
            height:100px;
            background-color: hotpink;
        }
    </style>
</head>
<body>
    <div id="app">
        <!-- v-model:不得使用!取反
            v-model如果使用在复选框中,则
            如果绑定的值为真,则复选框勾选
            反之不勾选---单向绑定
            如果主动勾选,则绑定的值为 true
            主动不勾选,则绑定的值为 false---双向绑定
        -->
        隐藏: <input type="checkbox" 
        v-model="flag1">
        <!-- 
            条件渲染两种方式
            1:v-if
                后面如果是真值,则元素显示,假值元素隐藏,底层不渲染
                可以取反,切换消耗较大,适用于不频繁切换的场合
        -->
        <div :class="{box:val}" v-if="!flag1"></div>
        <hr>
        <!-- 
            2:v-show
                后面如果是真值,则元素显示,假值元素隐藏,底层依然渲染
                只不过添加了一个 display:none的行内式 可以取反
                初始载入消耗较大,之后切换消耗较小,适合频繁切换的
                场合
        -->
        隐藏: <input type="checkbox" v-model="flag2">
        <div :class="{box:val}" v-show="!flag2"></div>
        <!-- Vue2.4新特性 v-else-if v-else 必须搭配 v-if 使用
        组成流程控制,必须紧邻,不能与 v-show 连用 -->
        <input type="button" value="点击!"
        @click="count++">
        <template v-if="count===0">Vue世界第二</template>
        <template v-else-if="count===1">React世界第一</template>
        <template v-else>jQuery濒临淘汰</template>
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                flag1:false,
                flag2:0,
                val:1,
                count:0,
            },
        })
    </script>    
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry鹿17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值