• day 72 vue框架


    1、v-model完成表单指令,简单的控制value,单选框中的使用,单独复选框的使用以及复选框中的使用

    value值会随着表单中输入值的改变而改变

    <body>
    <div id="app">
    <form action="">
    <!--属性指令:v-model="变量",v-model绑定的变量控制的是表单元素的value值 -->

    <!--普通表单元素,用v-model直接绑定变量控制value值-->
    <input type="text" v-model="v1">
    <input type="text" v-model="v1">
    <textarea name="" id="" cols="30" rows="10" v-model="v1"></textarea>
    <p>{{ v1 }}</p>
    <hr>

    <!--单一复选框-->
    同意:
    <input type="checkbox" name="agree" v-model="v2">
           {{v2}}
    <hr>
    <!--多个复选框-->
    男:<input type="checkbox" name="hobbies" value="male" v-model="v3">
    女:<input type="checkbox" name="hobbies" value="female" v-model="v3">
    哇塞:<input type="checkbox" name="hobbies" value="wow" v-model="v3">
    <p>{{ v3 }}</p>
    <hr>

    <!--单选框-->
    中午吃啥:<br>
    肉肉:<input name="food" type="radio" value="rourou" v-model="v4">
    饭饭:<input name="food" type="radio" value="fanfan" v-model="v4">
    <p>{{ v4 }}</p>
    <hr>
    <button type="submit">提交</button>
    </form>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    v1: '',
    v2: false, // false
    v3: ['male', 'wow'],
    v4: 'rourou',
    }
    })
    </script>

    2、了解:斗篷指令解决页面闪烁

    当msg没有指定值时,{{}}不会显示,但是会闪烁,所以可以用斗篷指令来避免,同时也可以在头部导入vue也可以避免这种问题

     <style>
    [v-cloak] {
    display: none;
    }
    </style>
    </head>
    <body>
    <div id="app" v-cloak>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
    <p>{{ msg }}</p>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    msg: 12345
    }
    })

    3、条件指令v-if与v-show区别,v-if家族成员以及上分支会成立会屏蔽下分支的工作机制

    <body>
    <div id="app">
    <!--条件指令:
    v-if="true|false",为假时,在页面上不渲染,可以隐藏标签中的信息
    v-show="true|false",为假时,在页面中用display:none渲染,虽然没展示,但是任在页面结构中
    -->
    <p v-if="false">if指令</p>
    <p v-show="false">show指令</p>

    <!-- v-if是一个家族
    v-if
    v-else-if
    v-else
    1、上分支成立,下分支会被屏蔽
    2、else分支只要在所有上分支都为假时显示,且不需要条件
    -->
    <p v-if="v1 === '1'">if分支</p>
    <p v-else-if="v1 === '2'">elif分支1</p>
    <p v-else-if="v1 === '3'">elif分支2</p>
    <p v-else>else分支</p>
    <hr>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    v1: '2'
    }
    })
    </script>

    案例:(重点)
    <head>
    <meta charset="UTF-8">
    <title>条件指令案例</title>
    <style>
    .box {
    400px;
    height: 200px;
    }
    .r { background-color: red }
    .y { background-color: yellow }
    .g { background-color: green }

    .action {
    background-color: pink;
    }
    </style>
    </head>
    <body>
    <div id="app">
    <p>
    <button @click="changeC('red')" :class="{action: c === 'red'}">红</button>
    <!--<button @click="changeC('red')" :class="c === 'red'? 'action': ''">红</button>-->
    <button @click="changeC('yellow')" :class="{action: c === 'yellow'}">黄</button>
    <button @click="changeC('green')" :class="{action: c === 'green'}">绿</button>
    </p>
    <div class="wrap">
    <div class="box r" v-if="c === 'red'"></div>
    <div class="box y" v-else-if="c === 'yellow'"></div>
    <div class="box g" v-else></div>
    </div>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    // sessionStorage的生命周期与页面标签绑定,当标签页被关闭,数据库被清空
    // localStorage是前台永久数据库 同一个ip和端口都可以访问

    // sessionStorage.name = '123';
    // localStorage.name = 'xyz';
    // localStorage.clear(); 清除


    new Vue({
    el: '#app',
    data: {
    // 页面重新刷新加载,可以从数据库中获取缓存,如果没有,再取默认值
    // c: 'red',
    c: localStorage.c ? localStorage.c : 'red',
    },
    methods: {
    changeC(color) {
    this.c = color;
    // 每一次改变c的值,将值同步到前台数据库
    localStorage.c = color; // 存
    }
    }
    })
    </script>


    4、循环指令v-for如何循环渲染字符串、数组、字典,以及需要嵌套循环渲染赋值结构

    <body>
    <div id="app">
    <!--循环指令:
    v-for=""
    语法:
    v-for="成员 in 容器"
    -->
    <!--1、字符串循环渲染: 可以只遍历值,也可以遍历值与索引-->
    <p>
    <span v-for="v in title">{{ v }}</span>
    </p>

    <p>
    <span v-for="(v, i) in title">
    <span v-if="i != 0"> | </span>
    {{ v }}
    </span>
    </p>

    <!--2、数组循环渲染: 可以只遍历值,也可以遍历值与索引-->
    <div>
    <p v-for="(v, i) in arr">第{{ i }}元素:{{ v }}</p>
    </div>

    <!--3、对象循环渲染: 可以只遍历值,也可以遍历值与键,还可以遍历值、键与索引-->
    <div>
    <p v-for="v in people">{{ v }}</p>
    </div>
    <div>
    <p v-for="(v, k) in people">{{ k }}:{{ v }}</p>
    </div>
    <div>
    <p v-for="(v, k, i) in people">{{ i }}-{{ k }}:{{ v }}</p>
    </div>
    <br>

    <div>
    <div v-for="(stu, i) in stus">
    <hr v-if="i != 0">
    <p v-for="(v, k) in stu">{{ k }}:{{ v }}</p>
    </div>
    </div>

    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    title: '循环指令',
    arr: [1, 4, 2, 5, 3],
    people: {
    name: '兔子',
    color: '粉白',
    price: 6.66,
    },
    stus: [
    {
    name: "Bob",
    age: 18
    },
    {
    name: "Tom",
    age: 17
    },
    {
    name: "Jerry",
    age: 19
    }
    ]
    }
    })
    </script>


    案例:
    <body>
    <div id="app">
    <input type="text" v-model="msg">
    <button @click="send_comment">留言</button>
    <ul>
    <li v-for="(v, i) in comments" @click="deleteMsg(i)">{{ v }}</li>
    </ul>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    msg: '',
    comments: []
    },
    methods: {
    send_comment() {
    // 数组的增
    // push pop 尾增尾减/unshift shift 头增头减/splice 万能
    // this.comments.unshift(this.msg);
    // this.comments.splice(0,0,0);
    if (this.msg) {
    this.comments.push(this.msg); // 留言
    this.msg = ''; // 留言后清空输入框
    }
    },
    deleteMsg(index) {
    this.comments.splice(index, 1);
    }
    }
    })
    </script>
    <script>

    // 数组操作万能方法,可以完成增删改
    let arr = [1, 2, 3];
    // 参数:开始索引,操作长度,操作的结果们
    arr.splice(2, 0, 100);
    arr.splice(1, 1);
    console.log(arr);

    </script>
     

    5、了解:delimiters实例成员解决插值表达式符号冲突

    当Django模版语法与Vue插值冲突

    <body>
    <div id="app">
    <p>{{ num }}</p>
    <!--<p>{[ num ]}</p>-->
    <p>{ num ]}</p>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    num: 100
    },
    // 用来修改插值表达式符号
    // delimiters: ['{[', ']}'],
    delimiters: ['{', ']}'], #常用['${''}']
    })
    </script>

    6、计算属性(方法属性)在computed中声明,方法内部变量会被监听,值来源于方法返回值

    <body>
    <div id="app">
    <input type="text" v-model="v1">
    +
    <input type="text" v-model="v2">
    =
    <button>{{ res }}</button>

    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    v1: '',
    v2: '',
    // res: '结果',
    },
    // 1、computed中定义的是方法属性,data中定义的也是属性,所以不需要重复定义(省略data中的)
    // 2、方法属性的值来源于绑定的方法的返回值
    // 3、方法属性必须在页面中渲染后,绑定的方法才会被启用(调用)
    // 4、方法中出现的所有变量都会被监听,任何变量发生值更新都会调用一次绑定的方法,重新更新一下方法属性的值
    // 5、方法属性值不能手动设置,必须通过绑定的方法进行设置,也就是说不能人为指定属性的值,比如在data里设置
    computed: {
    res () {
    console.log('该方法被调用了');
    return this.v1 && this.v2 ? +this.v1 + +this.v2 : '结果';#js是弱类型语言,会自动更改数据类型
                }
    }
    })
    </script>
    <script>
    console.log(1 + '2');
    console.log(1 - '2');
    console.log(+'2');
    </script>

    7、监听watch可以设置数据的监听方法,在监听属性更新时,完成特定逻辑

    <body>
    <div id="app">
    <p>
    姓名:<input type="text" v-model="full_name">
    </p>
    <p>
    姓:<span>{{ first_name }}</span>
    </p>
    <p>
    名:<span>{{ last_name }}</span>
    </p>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    full_name: '',
    first_name: '',
    last_name: '',
    },
    watch: {
    // 1、watch中给已有的属性设置监听方法
    // 2、监听的属性值一旦发生更新,就会调用监听方法,在方法中完成相应逻辑
    // 3、监听方法不需要返回值(返回值只有主动结束方法的作用)
    full_name() {
    if (this.full_name.length === 2) {
    k_v_arr = this.full_name.split('');
    this.first_name = k_v_arr[0];
    this.last_name = k_v_arr[1];
    }
    }
    }
    })
    </script>

    8、重点:组件的概念,组件就是vue实例(对象)

    <body>
    <div id="app">
    {{ msg }}
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    /**
    * 1、组件:由html、css、js三部分组成的独立单位,可以类似于变量,重复使用
    * 2、组件其实就是vue实例(对象),一个组件就是一个vue实例(对象)
    * 3、new Vue()产生的也是实例(对象),所以也是组件,我们称之为 根组件
    * 一个页面建议只出现一个根组件(项目开发模式下,一个项目建议只出现一个根组件)
    * 4、组件的html页面结构由 template 实例成员提供
    * template提供的html结构是用来构虚拟DOM
    * 真实DOM最终会被虚拟DOM替换
    * 根组件一般不提供template,就由挂载点el来提供构建虚拟DOM的页面结构,根组件如果提供了template,还需要设置挂载点作为替换占位
    * template模板有且只有一个根标签
    */
    let c1 = '';
    new Vue({
    el: '#app',
    data: {
    msg: '12345',
    c1: 'red'
    },
    template: `
    <div id="app">
    <p :style="{color: c1}">{{ msg }}</p>
    <p @click="clickAction">{{ msg }}</p>
    </div>
    `,
    methods: {
    clickAction() {
    console.log(this.msg)
    }
    }
    })
    </script>

    9、创建、注册、使用子组件的三部曲

    <body>
    <!--根组件的template-->
    <div id="app">
    <!--在根组件template中加载的组件,称之为根组件的子组件-->
    <my-tag></my-tag>
    <my-tag></my-tag> # html和css中,-代替js中的驼峰体
    <my-tag></my-tag>

    <tag></tag>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    // 1、定义组件
    // 2、注册组件
    // 3、使用组件

    // 如何定义子组件:组件就是一个普通对象,内部采用vue语法结构,被vue注册解释后,就会成为vue组件
    let myTag = {
    template: `
    <div>
    <h3>子组件</h3>
    <p>我是自定义的子组件</p>
    </div>
    `,
    };

    // 了解:全局组件,不要注册就可以直接使用
    Vue.component('tag', {
    template: `
    <div>
    <h3>全局组件</h3>
    <p>我是自定义的全局组件</p>
    </div>
    `,
    });


    new Vue({
    el: '#app',
    components: {
    // 'my-tag': myTag,
    // myTag: myTag,
    myTag,
    }
    })
    </script>
  • 相关阅读:
    道德经 剪裁重组版 v1.1
    摸索出来的学习经典的一种方法
    小玩意儿之Gitlab 代码提交日志同步到禅道项目管理系统
    个人职业发展模型
    善小
    学习英文
    物欲
    理解newid()和newsequentialid()
    ubuntu14.04设置静态ip
    .Net 调式案例—实验4 高CPU(High CPU)回顾
  • 原文地址:https://www.cnblogs.com/wwei4332/p/11844581.html
Copyright © 2020-2023  润新知