• mvc项目+vue+vant【进行中】


    项目没有考虑前后端分离,也未使用vue-cli脚手架,单纯引入vue.js,vant也是单纯引入css和js,可能无法使用vue-router,因为是移动端项目所以暂时引入了jquery-3.3.1.min.js(当vue无法实现的时候用吧)

    目前引入的工具:

    <link href="/Content/reset.css" rel="stylesheet"/>清除浏览器默认样式
    <link href="/Content/vant.css" rel="stylesheet"/>vant样式
    <link href="/Content/alicon.css" rel="stylesheet"/>iconfont阿里图标
    <link href="/Content/master.css" rel="stylesheet"/>公共样式
    
    
    <script src="/Scripts/main.js"></script>公共js,目前只定义了rem
    <script src="/Scripts/vue.js"></script>vue的js
    <script src="/Scripts/vue-lazyload.js"></script>vue图片懒加载
    <script src="/Scripts/vuex.js"></script>vuex的js
    <script src="/Scripts/vant.min.js"></script>vant的js
    <script src="/Scripts/jquery-3.3.1.min.js"></script>jq的js
    <script type="text/javascript" src="/Scripts/layout/store.js"></script>状态管理,测试能用,不知道用不用的上
    
    <script src="/Scripts/index/index.js"></script>每个页面自己的js,通过@section scripts{<script src="..."></script>}加载进来,在_Layout.cshtml中通过@RenderSection("scripts", required: false)读取
    <script type="text/javascript" src="/Scripts/layout/layout.js"></script>框架的js,相当于脚手架里的main.js,
    所以这个js在最底部,而上面是每个页面各自的js,我把他当成组件,这样就形成了,先要创建组件,然后在layout.js中注册组件,再到html中使用组件的三部曲了,
    同样store也是放进layout.js这里
    关于vue-router我查到的是:
    不用vue-cli没法用组件,也没法组件复用,路由跳转也没有意义,所以在没有.vue文件的情况下真的无能为力
    
    

    说实话不用vue-cli,vant用的也很费劲,跳转页面我就用了v-on:click,而且所有的简写都不能用,例如@click   :src都不行,不知道是vs不认还是别的原因,

    最重要的一点,没有webpack,就没有babel,也没有less,不能用es6语法,axios可能也不行,所以我引入了jq

    _Layout.cshtml  框架页

    <div id="app" v-cloak>
        <!--嵌套的页面-->
        @RenderBody()
    </div>
    <!--组件-->
    <template id="tabbartemp">
        <!--导航组件-->
        <van-tabbar v-model="index" ref="uuu">
            <!--<van-tabbar-item v-on:touchstart="handleTouchStart" v-on:click="handleleterClick">-->
            <van-tabbar-item v-on:click="tiaozhuan($event)">
                <van-icon class="iconfont iconhome" class-prefix='icon' slot="icon" slot-scope="props"
                          :name='props.active ? icon.home_active:icon.home_normal'></van-icon>
                <span>首页</span>
            </van-tabbar-item>
            <van-tabbar-item :dot="flag" v-on:click="tiaozhuan1($event)">
                <van-icon class="iconfont iconfangdajing2" class-prefix='icon' slot="icon" slot-scope="props"
                          :name='props.active ? icon.fangdajing2_active:icon.fangdajing2_normal'></van-icon>
                <span>找货</span>
            </van-tabbar-item>
    
            <van-tabbar-item :info="6" v-on:click="tiaozhuan2($event)">
                <van-icon class="iconfont iconche" class-prefix='icon' slot="icon" slot-scope="props"
                          :name='props.active ? icon.che_active:icon.che_normal'></van-icon>
                <span>找车</span>
            </van-tabbar-item>
            <!--<van-tabbar-item info="5">-->
            <!--<van-icon class="iconfont icondingdan" class-prefix='icon' slot="icon" slot-scope="props"-->
            <!--:name='props.active ? icon.dingdan_active:icon.dingdan_normal'></van-icon>-->
            <!--<span>发布</span>-->
            <!--</van-tabbar-item>-->
            <van-tabbar-item :info="iinn" v-on:click="gengxin">
                <van-icon class="iconfont iconwode" class-prefix='icon' slot="icon" slot-scope="props"
                          :name='props.active ? icon.wode_active:icon.wode_normal'></van-icon>
                <span>我的</span>
            </van-tabbar-item>
        </van-tabbar>
    
        <!--使用图片-->
        <!--<van-tabbar v-model="active">-->
        <!--<van-tabbar-item v-on:click="tiaozhuan($event)">-->
        <!--<span>找货</span>-->
        <!--<img slot="icon" slot-scope="props" :src="props.active ? icon.fangdajing1 : icon.fangdajing2">-->
        <!--</van-tabbar-item>-->
        <!--</van-tabbar>-->
    </template>
    <!--组件模板只能放在这里,因为vm实例中components有注册这个组件-->
    <template id="eerr">
        <!--顶部组件-->
        <van-nav-bar :title="title" left-text="返回" right-text="按钮" left-arrow v-on:click-left="onClickLeft1" v-on:click-right="onClickRight1"/>
    </template>
    <template id="counter1">
        <div>{{counn}}</div>
    </template>
    <template id="counter2">
        <div>{{aabb}}</div>
    </template>
    <!--<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js"></script>-->
    @Scripts.Render("~/bundles/main")
    @Scripts.Render("~/bundles/vue")
    @Scripts.Render("~/bundles/vant")
    @Scripts.Render("~/bundles/other")
    <script type="text/javascript" src="/Scripts/layout/store.js"></script>
    @RenderSection("scripts", required: false)
    <script type="text/javascript" src="/Scripts/layout/layout.js"></script>

    layout.js

    Vue.use(VueLazyload, {
        //preLoad: 1.3,//预加载高度的比例
        loading: 'https://img.yzcdn.cn/vant/user-active.png',//加载时的图片
        error: 'https://img.yzcdn.cn/vant/user-active.png',//错误时的图片
        attempt: 1//尝试次数
    });
    
    //子组件
    let tabbar = {
        name:'tabbartemp',
        template:'#tabbartemp',
        data(){
            return {
                iinn:num,
                flag:true,
                icon: {
                    fangdajing1: 'https://img.yzcdn.cn/vant/user-active.png',
                    fangdajing2: 'https://img.yzcdn.cn/vant/user-inactive.png',
                    dianhua1: 'https://img.yzcdn.cn/vant/user-active.png',
                    dianhua2: 'https://img.yzcdn.cn/vant/user-inactive.png',
                    che1: 'https://img.yzcdn.cn/vant/user-active.png',
                    che2: 'https://img.yzcdn.cn/vant/user-inactive.png',
                    dingdan1: 'https://img.yzcdn.cn/vant/user-active.png',
                    dingdan2: 'https://img.yzcdn.cn/vant/user-inactive.png',
                    wode1: 'https://img.yzcdn.cn/vant/user-active.png',
                    wode2: 'https://img.yzcdn.cn/vant/user-inactive.png'
                }
            }
        },
        //父传子参数
        //props:['active'],//active传的是索引,(属性名)
        props:{
            active:{
                type:Number,
                default:0
            },
            m:{
                type:String,
                default:''
            }
        },
        //计算属性
        computed:{
            index:{
                get(){
                    return this.active;
                },
                set(){}
            }
        },
        //方法
        methods:{
            //用click更改url实现页面跳转
            tiaozhuan: function (event) {
                location.href = "/Home/Index";
            },
            tiaozhuan1: function (event) {
                location.href = "/Home/About";
            },
            tiaozhuan2: function (event) {
                location.href = "/Home/Contact";
            },
            gengxin:function(){
                //方法一,在子组件里直接可以修改父的值(sync)
                this.$emit('update:m','鳄鱼')
                //方法二,在子组件里触发父组件的方法
                this.$emit('child-tot')
                //两个方法可以并存,就看你使用组件时使用的是事件还是sync的方式
            }
        }
    };
    
    //父组件
    let vm = new Vue({
        el: '#app',
        store,
        data: {
            aabb:"150父传子",
            total:'abcd',
            cityArr:['北京','上海','广州','深圳','青岛','济南','烟台','威海','泰安'],
            init:null,
            images: [
                'https://img.yzcdn.cn/vant/apple-1.jpg',
                'https://img.yzcdn.cn/vant/apple-2.jpg'
            ]
        },
        //初始化
        created() {
            //this.active = num;
            this.getData();
        },
        computed:{//使用vuex必须要放在计算属性里,进行实时计算,好得到更新的数据,否则就失去意义了
            //这个count对应的是页面上的{{count}}
            count:function(){
                return this.$store.state.count;       //return this.store.state.count
            },
            //这个city对应的是页面上的{{city}}
            city:function() {
                // 通过vuex的getters方法来获取state里面的数据
                return this.$store.getters.getCityFn;
                //return this.$store.state.city
                //因为在getters里只是返回了city,所以这里和直接用state.city结果是一样的
            },
            userName:function(){
                return this.$store.getters.userName;
            }
        },
        //方法
        methods: {
            getData:function(){
                $.ajax({
                    type: 'get',
                    url: "/scripts/read.txt",
                    dataType: 'json',
                    success: function (data) {
                        if(data){
                            this.init = data;
                            console.log(data);
                            console.log('ok');
                        }
                    }
    
                });
            },
            onClickLeft:function() {
                //this.$toast('返回');
                //history.go(-1);
                history.back();
                //history.forward();
    
            },
            onClickRight:function() {
                this.$toast('按钮');
            },
            change:function() {
                this.$refs.child.iinn += 2;
                if(this.$refs.child.iinn>8){
                    this.$refs.child.iinn = null;
                    this.$nextTick(function(){
                        this.$refs.tyu.style.display = 'none';
                    })
    
                }
            },
            gai:function() {
                if(this.$refs.child.flag){
                    this.$refs.child.flag = false;
                }else{
                    this.$refs.child.flag = true;
                }
            },
            //方法二
            upd:function(){
                this.total = '大象'
            },
            butonly:function(){
                //这里是不通过actions,直接去触发mutations中的add方法
                this.$store.commit('add')
            },
            getdataa:function(){
                //这里是不通过actions,直接去触发mutations中的add方法
                this.$store.commit('getdataa',this.cityArr)
            },
            add:function(){
                //这里是通过actions分发,actions中的方法必须通过dispatch来触发!!!
                //store.dispatch('add')
                this.$store.dispatch({
                    type: 'add'
                })
            },
            reduce:function(){
                this.$store.dispatch('reduce',5)//参数传给actions中的方法
            },
            backFn:function(index){
                // 调用vuex的ations设置城市的值
                this.$store.dispatch("setCityName", this.cityArr[index]);
                console.log(this.$store.state.city)//得到我当前选中的城市
            },
        },
        //注册组件
        components:{
            tabbar,eerr,counter1,counter2
        }
    });//.$mount('#app')

    master.css

    [v-cloak]{display: none;}
    
    #app{
        font-size:14px;
    }
    .my-swipe .van-swipe-item {
        color: #fff;
        font-size: 20px;
        line-height: 150px;
        text-align: center;
        background-color: #39a9ed;
    }
    .van-swipe{
        max-height:3.5rem;/*这里设置轮播焦点高度*/
    }
    .van-swipe img{
        width:100%;
    }
    /*修改选中颜色*/
    /*.van-tabbar-item--active{*/
        /*color:#ff9900;*/
    /*}*/

    index.cshtml

    @{
    ViewBag.Title = "首页";
    Layout = "~/Views/Shared/_Layout.cshtml";
    }
    <div>
        <!--标题-->
        <!--子组件可以用自己的方法-->
        <eerr></eerr>
        <!--轮播图-->
        <div>
            <van-swipe :autoplay="3000">
                <van-swipe-item v-for="(image, index) in images" :key="index">
                    <img v-lazy="image" />
                </van-swipe-item>
            </van-swipe>
        </div>
        <div>
            首页页面内容
            {{total}}<br/>
            
            <button v-on:click="change" ref="tyu">123</button>
        </div>
        <!--导航组件,active传的是索引,(属性名)-->
        <!--这里只是更新值-->
        <tabbar :active="0" ref="child" :m.sync="total"></tabbar>
    </div>
    
    <!--该页面的js-->
    @section scripts{
    <script src="/Scripts/index/index.js"></script>
    }

    index.js

    var num = 0;
    //子组件
    let eerr = {
        name:'eerr',
        template:'#eerr',
        data(){
            return {title:'首页'}
        },
        methods:{
            onClickLeft1:function() {
                this.$toast('独立组件');
            },
            onClickRight1:function() {
                this.$toast('独立组件按钮');
            }
        }
    }

    store.js

    let store = new Vuex.Store({
        state:{
            count:0,//值是通过计算属性实时渲染的
            city:"城市名",
            counn:"120store"
        },
        // 2. getters改变state中值的状态,形成新的值
        getters:{
            // 参数列表state指的是state数据
            getCityFn(state){
                return state.city;
            },
            userName(state){
                return state.count + ',hello';
            }
        },
        mutations:{
            add:function(state){
                state.count++;
            },
            reduce:function(state,val){
                state.count -= val;
            },
            // state指的是state的数据
            // name传递过来的数据
            setCity:function(state, name){
                state.city = name;//将传参设置给state的city
            },
            getdataa:function(state,val){
                state.counn = val;
            }
        },
        actions:{
            add:function(context){
                context.commit('add')
            },
            reduce:function(context,num){
                context.commit('reduce',num);//这里num接收dispatch传来的参数
                //return store.commit('reduce')
            },
            // 设置城市信息
            // 参数列表:{commit, state}
            // state指的是state数据
            // commit调用mutations的方法
            // name就是调用此方法时要传的参数
            setCityName:function({commit,state}, name){
                // 跟后台打交道
                // 调用mutaions里面的方法
                commit("setCity", name);
            }
        }
    })

    about.cshtml

    @{
    ViewBag.Title = "找货";
    Layout = "~/Views/Shared/_Layout.cshtml";
    }
    <div>
        <!--标题-->
        <div>
            <van-nav-bar title="@ViewBag.Title" left-text="返回" right-text="按钮" left-arrow v-on:click-left="onClickLeft" v-on:click-right="onClickRight"/>
        </div>
    
        <div>
            找货页面内容<br/>
            <!--{{$store.state.count}}这种写法就不是通过计算属性了,而是直接找state下的状态-->
            {{userName}}<br/>
            <p><button v-on:click="butonly">也可以加</button></p>
            <p>
                <button v-on:click="add">+++</button>
                <button v-on:click="reduce">---</button>
            </p>
            <br/>
            <h3>@ViewBag.Message</h3>
            <counter1></counter1>
            <button v-on:click="getdataa">999</button>
            <counter2 v-bind:aabb="aabb"></counter2>
            <p>Use this area to provide additional information.</p>
            <button v-on:click="gai" ref="tyu">456</button>
        </div>
        <tabbar :active="1" ref="child"></tabbar>
    </div>
    <!--该页面的js-->
    @section scripts{
    <script src="/Scripts/index/about.js"></script>
    }

    about.js

    var num = 1;
    let counter1 = {
        //这里是通过store来拿数据
        template:'#counter1',
        computed:{
            counn(){
                return this.$store.state.counn;
            }
        }
    }
    let counter2 = {
        //这里是父传子
        template:'#counter2',
        props:['aabb']
    }

    contact.cshtml

    @{
    ViewBag.Title = "找车";
    Layout = "~/Views/Shared/_Layout.cshtml";
    }
    <div>
        <!--标题-->
        <div>
            <van-nav-bar title="@ViewBag.Title" left-text="返回" right-text="按钮" left-arrow v-on:click-left="onClickLeft" v-on:click-right="onClickRight"/>
        </div>
    
        <div>
            找车页面内容
            {{total}}
            <h3>@ViewBag.Message</h3>
    
            <address>
                <!--city是vuex里的数据-->
                <h1>{{city}}</h1>
                <div class="city">
                    <ul>
                        <li v-for="(item,index) in cityArr" v-on:click="backFn(index)">
                            <h2>{{item}}</h2>
                        </li>
                    </ul>
                </div>
            </address>
    
            
        </div>
        <!--这里可以触发父级的方法,做更多事-->
        <tabbar :active="2" v-on:child-tot="upd"></tabbar>
    </div>
    <!--该页面的js-->
    @section scripts{
    <script src="/Scripts/index/contact.js"></script>
    }
  • 相关阅读:
    《敏捷软件需求》阅读笔记三
    《敏捷软件需求》阅读笔记二
    《敏捷软件需求》阅读笔记一
    《需求工程-软件建模与分析》阅读笔记三
    《需求工程-软件建模与分析》阅读笔记二
    《需求工程-软件建模与分析》阅读笔记一
    C#.NET程序设计实验三实验报告
    C#.NET程序设计实验二实验报告
    C#.NET程序设计实验一实验报告
    oracle——存储数据时的编码问题
  • 原文地址:https://www.cnblogs.com/liufeiran/p/12666687.html
Copyright © 2020-2023  润新知