zoukankan      html  css  js  c++  java
  • day73 vue框架

    1、可以用来复用的子组件,数据data需要做局部化处理,当组件被复用时,数据会相互独立

    <style>
    .wrap {
    calc(200px * 4 + 80px);
    margin: 0 auto;
    user-select: none;
    }
    .box {
    200px;
    height: 260px;
    /*border: 1px solid black;*/
    background-color: rgba(10, 200, 30, 0.5);
    border-radius: 10px;
    float: left;
    margin: 10px;
    }
    .box img {
    100%;
    /*height: 200px;*/
    border-radius: 50%;
    }
    .box p {
    text-align: center;
    }
    </style>
    </head>
    <body>
    <div id="app">
    <div class="wrap">
    <tag></tag>
    <tag></tag>
    <tag></tag>
    <tag></tag>
    </div>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    let titleTag = {
    template: `
    <p>
    <b>
    这是一种纯二哈
    </b>
    </p>
    `,
    };

    let tag = {
    template: `
    <div class="box">
    <img src="img/001.jpg" alt="">
    <title-tag />
    <p @click="fn">
    锤它:<b>{{ num }}下</b>
    </p>
    </div>
    `,
    // 能被复用的组件(除了根组件),数据都要做局部化处理,因为复用组件后,组件的数据是相互独立的
    // data的值为绑定的方法的返回值,返回值是存放数据的字典
    data () {
    return {
    num: 0
    }
    },
    methods: {
    fn() {
    this.num ++
    }
    },
    components: {
    titleTag,
    }
    };

    new Vue({
    el: '#app',
    components: {
    tag,
    }
    });
    </script>


    2、将父组件的数据传递给子组件,在渲染子组件标签时,给自定义属性设置父级数据,在子级内部用自定义属性拿父级数据

    <style>
    .wrap {
    calc(200px * 4 + 80px);
    margin: 0 auto;
    user-select: none;
    }
    .box {
    200px;
    height: 260px;
    /*border: 1px solid black;*/
    background-color: rgba(10, 200, 30, 0.5);
    border-radius: 10px;
    float: left;
    margin: 10px;
    }
    .box img {
    /* 100%;*/
    height: 160px;
    border-radius: 50%;
    margin: 0 auto;
    display: block;
    }
    .box p {
    text-align: center;
    }
    </style>
    </head>
    <body>
    <div id="app">
    <div class="wrap">
    <!--<div v-for="dog in dogs" class="box">-->
    <!--<img :src="dog.img" alt="">-->
    <!--<p>-->
    <!--<b>-->
    <!--{{ dog.title }}-->
    <!--</b>-->
    <!--</p>-->
    <!--</div>-->
    <tag v-for="dog in dogs" v-bind:dog="dog" :a="1" :b="2" />
    </div>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    let dogs = [
    { title: '二哈1号', img: 'img/1.jpg', },
    { title: '二哈2号', img: 'img/2.jpg', },
    { title: '二哈3号', img: 'img/3.jpg', },
    { title: '二哈4号', img: 'img/4.jpg', },
    { title: '二哈1号', img: 'img/1.jpg', },
    { title: '二哈2号', img: 'img/2.jpg', },
    { title: '二哈3号', img: 'img/3.jpg', },
    { title: '二哈4号', img: 'img/4.jpg', },
    ];

    let tag = {
    // 在组件内部就可以通过设置的自定义属性,拿到外部选择子组件提供给属性的值
    props: ['dog', 'a', 'b', 'z'],
    template: `
    <div class="box">
    <img :src="dog.img" alt="">
    <p>
    <b>
    {{ dog.title }}
    </b>
    </p>
    <p @click="fn">
    锤它:<b>{{ num }}下</b>
    </p>
    </div>
    `,
    data () {
    return {
    num: 0,

    }
    },
    methods: {
    fn() {
    this.num ++
    }
    },
    };

    new Vue({
    el: '#app',
    data: {
    dogs,
    },
    components: {
    tag,
    }
    });
    /** 总结
    * 1.数据在父组件中产生
    * 2.在父组件中渲染子组件,子组件绑定自定义属性,附上父组件中的数据
    * 3.子组件自定义属性在子组件的props成员中进行声明(采用字符串发射机制)
    * 4.在子组件内部,就可以用props声明的属性(直接作为变量)来使用父组件中的数据
    */
    </script>


    3、将子组件的数据传递给父组件,子组件需要主动触发$emit自定义事件携带出数据,父级实现自定义事件方法,就可以接收到子级数据

    <style>
    ul {
    list-style: none;
    }
    .d-btn {
    font-size: 12px;
    15px;
    display: inline-block;
    }
    .d-btn:hover {
    color: red;
    cursor: pointer;
    }
    </style>
    </head>
    <body>
    <div id="app">
    <input type="text" v-model="msg">
    <button @click="send_comment">留言</button>
    <ul>
    <tag v-for="(v, i) in comments" :msg="v" :index="i" @f1="deleteMsg"/>
    </ul>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    let tag = {
    props: ['msg', 'index'],
    template: `
    <li>
    <i class="d-btn" @click="fn">x</i>
    <b>{{ msg }}</b>
    </li>
    `,
    methods: {
    fn () {
    // 点击子集,要告诉父级删除第几条数据,因为comments在父级中
    // 需要通知父级
    this.$emit('f1', this.index);
    }
    }
    };


    new Vue({
    el: '#app',
    data: {
    msg: '',
    comments: localStorage.comments ? JSON.parse(localStorage.comments) : [],
    },
    components: {
    tag,
    },
    methods: {
    send_comment() {
    if (this.msg) {
    this.comments.push(this.msg);
    this.msg = '';
    localStorage.comments = JSON.stringify(this.comments);
    }
    },
    deleteMsg(index) {
    this.comments.splice(index, 1);
    localStorage.comments = JSON.stringify(this.comments);
    }
    }
    })
    </script>
    <script>
    // localStorage,sessionStorage不能直接存储数组和对象,需要序列化为json
    localStorage.arr = JSON.stringify([1, 2, 3]);
    let res = JSON.parse(localStorage.arr);
    console.log(res, res[2]);
    </script>
    div id="app">
    <h1> {{ title }} </h1>
    <!-- 组件标签不能添加系统事件,只能添加自定义事件,自定义事件在组件内部通过$emit主动触发 -->
    <tag @self_action="changeTitle"/>
    </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
    let tag = {
    template: `
    <div>
    <input v-model="sub_title" />
    </div>
    `,
    data() {
    return {
    sub_title: ''
    }
    },
    watch: {
    sub_title() {
    // 将sub_title与父级的title建立关联
    // 激活(触发)self_action自定义事件
    this.$emit('self_action', this.sub_title)
    }
    }
    };

    new Vue({
    el: '#app',
    components: {
    tag,
    },
    data: {
    title: '父级初始标题'
    },
    methods: {
    changeTitle(sub_title) {
    this.title = sub_title ? sub_title : '父级初始标题';
    }
    }
    })
    </script>

    4、搭建vue环境需要依赖node环境,以及用npm包管理器安装vue脚手架cli(npm可以换源为cnpm)
    5、通过 vue create 项目 来创建前台项目,选择配置好项目所需的依赖
    6、用pycharm来配置vue项目启动
    7、属性vue项目目录结构,以及基本的各种原理:项目入口从main.js开始

  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/wwei4332/p/11852139.html
Copyright © 2011-2022 走看看