vue-example

一:组件案例发表评论

HTML代码如下:

<body>
    <div id="app">
        <com1 @func="loadComments"></com1>
        <ul class="list-group">
            <li class="list-group-item" v-for="item in list" :key="item.id">
                <span class="badge">评论人:{{item.user}}</span>
                {{item.content}}
            </li>
        </ul>
    </div>
    <template id="box">
        <div>
            <div class="form-group">
                <label>评论人:<input type="text" class="form-control" v-model="user"></label>
            </div>
            <div class="form-group">
                <label>评论内容:<textarea class="form-control" v-model="content"></textarea></label>
            </div>
            <div class="form-group">
                <input type="button" value="评论" class="btn btn-primary" @click="postComment"></input>
            </div>
        </div>
    </template>
</body>

vue代码如下:

<script>
    var commentBox = {
        template: '#box',
        data() {
            return {
                user: '',
                content: '',
            }
        },
        methods: {
        // 分析:发表评论的业务逻辑
            // 1、评论数据存放到localstorage,localStorage.setItem('cmst','')
            // 2、先组织出一个最新的评论数据对象
            // 3、把第2部中得到的评论对象保存到localstorage中,
            // 3.1Local storage只支持存放字符串数据,先要调用JSON.stringify,
            // 3.2在保存最新的评论数据之前,要先从local storage获取到之前的评论数据(string)转为一个数组对象,然后把最新的评论unshift到这个数组中
            // 3.3如果获取到的local storage中的评论字符串为空不存在,就可以返回一个[],让JSON.parse去转化
            // 3.4把最新的评论列表数组再次调用JSON.stringify转换为数字数组字符串,然后调用localstorage.setIitem()

            postComment() {//发表评论的按钮
                // 获取评论数据
                var comment = { id: Date.now(), user: this.user, content: this.content }
                // 从localStorage中获取评论
                var list = JSON.parse(localStorage.getItem('cmts') || '[]');
                list.unshift(comment);
                // 重新保存最新的评论数据,
                localStorage.setItem('cmts', JSON.stringify(list));
                // 点击评论之后,清空数据
                this.user = this.content = '';
                //点击评论的时候就,子组件调用父组件的方法来刷新
                this.$emit('func');
            }
        },
    }
    new Vue({
        el: '#app',
        data: {
            list: [
                { id: Date.now(), user: '李四1', content: '天生我才必有用1' },
                { id: Date.now(), user: '李四2', content: '天生我才必有用2' },
                { id: Date.now(), user: '李四3', content: '天生我才必有用3' },
            ]
        },
        created() {
            this.loadComments();
        },
        methods: {
            loadComments(){
                 // 从localStorage中获取评论,刷新页面
                 var list = JSON.parse(localStorage.getItem('cmts') || '[]');
                 this.list=list;
            }
        },
        components: {
            com1: commentBox
        }
    });

 二:使用命名视图实现经典布局,一个页面放多个视图

HTML代码如下:

<body>
    <div id="app">
        <router-view></router-view>
        <div class="container">
            //<!-- name 写的是普通属性,是一个值 -->
            //<!-- 前面加冒号了,就需要加一个单引号如:name="'leftBox'",没有冒号就代表一个字符串 -->
            <router-view name="leftBox"></router-view>
            <router-view name="mainBox"></router-view>
        </div>
    </div>
</body>

样式代码如下:

 *{
            margin: 0;
            padding: 0;
        }
        h1{
            padding: 0;
            margin: 0;
            font-size: 16px;
        }
        .header {
            background-color: olive;
            height: 60px;
        }
        .container{
            display: flex;
            height: 600px;
        }
        .leftBox{
            flex: 2;
            background-color: orange;
        }
        .mainBox{
            background-color: palegreen;
            flex: 8;
        }

vue代码如下:

var header = {
        template: '<h1 class="header">header</h1>'
    }
    var leftBox = {
        template: '<h1 class="leftBox">leftBox</h1>'
    }
    var mainBox = {
        template: '<h1 class="mainBox">mainBox</h1>'
    }
    var router = new VueRouter({
        routes: [
            // {path:'/',component:header},
            // {path:'/leftBox',component:leftBox},
            // {path:'/mainBox',component:mainBox},
            //  上面那种不行
            { //这个路劲下挂载了三个子组件
                path: '/', components: {
                    'default': header,
                    'leftBox': leftBox,
                    'mainBox': mainBox
                }
            },

        ]
    });
    new Vue({
        el: '#app',
        data: {},
        methods: {},
        router
    });

 

posted @ 2019-11-02 12:30  柠檬abcd  阅读(924)  评论(0编辑  收藏  举报