如何在传统前后端不分离的项目中使用模块化开发方式写.vue格式文件

项目情况

项目是c#的三层架构技术搭建的,前端这一块是在.aspx页面中以script标签引入js <link rel="stylesheet">方式引入css的方式来开发的后台系统网站。

网站整体界面结构如下图

QQ图片20190719102256

左侧是菜单,右侧是主题内容页面,主题内容是嵌入在一个iframe中,通过点击左侧菜单,切换iframe的src在显示不同的页面。

vue 单文件形式开发

思路

- 1. 页面的右侧部分提供一个占位符节点,这个节点用 Vue 渲染,实际上就是执行一段 JS 代码

- 2. 通过webpack配置一个vue项目,打包出一段JS。然后再右侧的页面中引入这个js

具体实践

项目目录

QQ图片20190719104003

新建一个目录vueDevInstanceModule,通过配置webpack构建vue项目的代码全放到里面

webpack相关使用请去看文档

下面是我这个项目中配置好的packjson.json与webpack.config.js
packjson.json

{
  "name": "webpack-project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "watch": "webpack --watch",
    "start": "webpack-dev-server --open",
    "build": "webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.4.5",
    "@babel/plugin-syntax-dynamic-import": "^7.2.0",
    "@babel/plugin-transform-runtime": "^7.4.4",
    "@babel/preset-env": "^7.4.5",
    "babel-loader": "^8.0.6",
    "clean-webpack-plugin": "^3.0.0",
    "copy-webpack-plugin": "^5.0.3",
    "extract-text-webpack-plugin": "^3.0.2",
    "html-webpack-plugin": "^3.2.0",
    "vue-loader": "^15.7.0",
    "vue-template-compiler": "^2.6.10",
    "webpack": "^4.35.2",
    "webpack-bundle-analyzer": "^3.3.2",
    "webpack-cli": "^3.3.5",
    "webpack-dev-server": "^3.7.2"
  },
  "dependencies": {
    "vue": "^2.6.10",
    "vue-router": "^3.0.6"
  }
}
View Code

webpack.config.js

const path = require('path');
// const CleanWebpackPlugin = require('clean-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
// var ExtractTextPlugin = require("extract-text-webpack-plugin")
var MiniCssExtractPlugin = require("mini-css-extract-plugin")

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; //分析js文件大小情况

function resolve(dir) {
  return path.join(__dirname, '..', dir)
}


console.log('---------------------------->', path.join(__dirname, 'dist'))

//配置输出文件目录
// const outputSrc = './dist/baseinfo';
const outputSrc = './dist/agent';
createOutputSrc(outputSrc)

function createOutputSrc(outputSrc) {

  var fs = require('fs');
  if (!fs.existsSync(outputSrc)) {
    fs.mkdirSync(outputSrc);
  }
}

module.exports = {
  mode: 'production', //development
  entry: './src/main.js',
  devtool: 'inline-source-map',
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      title: '管理输出',
      template: 'index.html',
    }),
    new VueLoaderPlugin(),
    
    new MiniCssExtractPlugin({
      filename: 'style.css'
    }),
   
    // new CopyWebpackPlugin([ // 拷贝暂时先不要,后面需要用到静态文件时在考虑
    //     {
    //       from: path.resolve(__dirname, 'src'),
    //       to: outputSrc,
    //       ignore: ['.*']
    //     }
    //   ])
    // new BundleAnalyzerPlugin()
  ],
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      //   'vue$': 'vue/dist/vue.esm.js',  3.0 写法
      //   '@': resolve('src'),
      //   components: resolve('src/components'),
      src: path.resolve(__dirname, './src/'),
      components: path.resolve(__dirname, './src/components/')
    }
  },
  module: {
    rules: [
      { 
        test: /.vue$/, 
        loader: 'vue-loader',
        options: {
          extractCSS: true
        }
      },
      {
        test: /.m?js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env'],
            // plugins: ['@babel/plugin-transform-runtime']
          }
        }
      },
   
      {
        test: /.css$/,
        use: [
          {loader: 'vue-style-loader'},'css-loader'
        ]
      },
    ]
  },
  devServer: {
    port: 8889,
    contentBase: path.join(__dirname, 'dist'), //对那个目录起服务 并监听文件变化更新代码
    // publicPath: '/' //webpack-dev-server 在编译之后不会写入到任何输出文件。而是将 bundle 文件保留在内存中 如果你的页面希望在其他不同路径中找到 bundle 文件,则可以通过 dev server 配置中的 publicPath 选项进行修改。
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, outputSrc) //'dist/'
   
  },

  optimization: {
    splitChunks: {
      cacheGroups: {
        default: false,
        vendors: false,
        vendor: {
          test: /[\/]node_modules[\/]/,
          name: 'vendors',
          chunks: 'all',
        },
      }
    }
  }
};
View Code

tips:

webpack相关配置已经配置好了,目前能够做到编写vue文件保存后就会自动编译为js,然后在对应的aspx页面引入这个js就行了。

这里以我的项目为例

运行项目与配置

1.运行后台项目,以新增代理商页面为例 打开地址`http://localhost:31545/riskManage/Agent/AgentAdd/#/`后

2.进入项目的`vueDevInstanceModulewebpack-project`目录下执行npm run watch,会自动打包出出vendors.js,main.js到`dist/agent`目录下,

3.AgentAdd.aspx页面底部引入vendors.js,main.js

AgentAdd.aspx

<script src="~/vueDevInstanceModule/webpack-project/dist/agent/vendors.js"></script>

<script src="~/vueDevInstanceModule/webpack-project/dist/agent/main.js"></script>

4.配置不同模块输出

多人协作每个人写不同的模块时,例如A写代理商模块,B写用户基本信息模块,分别只打包自己写的代码

#以新增一个用户信息模块为例,需要做以下4

(1).修改webpack的输出地址

webpack.config.js

const outputSrc = './dist/baseInfo';

(2).复制一份路由router.js文件做好页面文件引入

// import Vue from 'vue'

import Router from 'vue-router'

import BaseInfo from 'components/baseInfo/addInfo'

import InfotList from 'components/baseInfo/InfoList'

Vue.use(Router)

(3).main.js中引入刚刚那个路由

import router from "./router/baseInfoRoute" //路由文件,

(4).useInfo.aspx页面引入

<script src="~/vueDevInstanceModule/webpack-project/dist/baseInfo/vendors.js"></script>

<script src="~/vueDevInstanceModule/webpack-project/dist/baseInfo/main.js"></script>

最后的特别说明

该方式目前只实现了把.vue文件中的html,js打包出js文件,css,img资源暂未做处理。因此css还是去以前的地方(`E:myWorkAllpro runkE8ManagementE8ManagementContentassetcss`)写吧

对了,watch的时候打包出的js想时时看效果需要强制刷新一下(ctrl+f5),由于没有做文件hash生成动态注入script标签到aspx中,我也想做呀,但是不好做。

还有不能使用异步加载路由,因为单独打包出来的xx.js个main.js不能一块放到aspx页面的同级main.js加载不到xx.js,这个可能是这里的后端三层构架view层解析的时候路由映射文件我所不知道的规则导致

结束~~

补充其他非.vue格式打包成js的开发模式

vue script标签引入的非webpack打包的形式开发
参考代码

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8">
    <meta name="description" content="Admin Template v.1">
    <meta name="author" content="Isna Nur Azis">
    <meta name="keyword" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>AgentList</title>

    <!-- start: Css -->
    <link rel="stylesheet" type="text/css" href="~/Content/asset/css/bootstrap.min.css">
    <!-- plugins -->
    <link rel="stylesheet" type="text/css" href="~/Content/asset/css/plugins/font-awesome.min.css" />
    <link rel="stylesheet" type="text/css" href="~/Content/asset/css/plugins/simple-line-icons.css" />
    <link rel="stylesheet" type="text/css" href="~/Content/asset/css/plugins/animate.min.css" />
    <link rel="stylesheet" type="text/css" href="~/Content/asset/css/plugins/fullcalendar.min.css" />
    <link rel="stylesheet" type="text/css" href="~/Content/asset/css/plugins/bootstrap-material-datetimepicker.css" />
    <link href="~/Content/asset/css/style.css" rel="stylesheet">
    <!-- end: Css -->
    <link rel="shortcut icon" href="~/Content/asset/img/logomi.png">
    <link href="~/Content/datetimepicker/datetimepicker.css" rel="stylesheet" />

    <link href="~/Content/asset/js/plugins/自动完成下拉选择--支持中文/css/selectpage.css" rel="stylesheet" />

    <!-- start: Javascript -->
    <script src="~/Content/asset/js/jquery.min.js"></script>
    <script src="~/Content/asset/js/jquery.ui.min.js"></script>
    <script src="~/Content/asset/js/bootstrap.min.js"></script>
    <script src="~/Content/asset/layer/layer.js"></script>
    <script src="~/Content/datetimepicker/datetimepicker.js"></script>
    <script src="~/Content/asset/js/plugins/citySelect/distpicker.data.js"></script>
    <script src="~/Content/asset/js/plugins/citySelect/distpicker.js"></script>
    @*<script src="~/Content/asset/js/plugins/自动完成下拉选择--支持中文/js/jquery-1.11.0.min.js"></script>*@
    <script src="~/Content/asset/js/plugins/自动完成下拉选择--支持中文/js/selectpage.js"></script>
    <!-- plugins -->
    <script src="~/Content/asset/js/plugins/moment.min.js"></script>
    <script src="~/Content/asset/js/plugins/fullcalendar.min.js"></script>
    <script src="~/Content/asset/js/plugins/jquery.nicescroll.js"></script>
    <script src="~/Content/asset/js/plugins/jquery.vmap.sampledata.js"></script>
    <script src="~/Content/asset/js/plugins/bootstrap-material-datetimepicker.js"></script>
    <script src="~/Content/asset/js/plugins/vue2.4.js"></script>
    <script src="~/Content/asset/js/cmn/Cmn.js"></script>
    <script src="~/Content/asset/js/cmn/CmnAjax.js"></script>
    <script src="~/Content/asset/js/cmn/CmnFuncExd.js"></script>
    <script src="~/Content/asset/js/utils/utils.js"></script>
    <style>
        /*.part_box{display:none;}*/
        .disabled {
            pointer-events:none;
            /*cursor:not-allowed;*/
        }
    </style>
</head>

<body>
    <div id="myMenu" style="position:relative;z-index:0;">
        <div v-show="IsShow" class="part_box" style="display:none;">
            <div class="panel box-shadow-none content-header">
                <div class="panel-body">
                    <div class="col-md-12">
                        <h4 class="animated fadeInLeft" style="margin:0px;margin-top:5px; padding:0px;"><span>风控管理</span> <span class="fa-angle-right fa"></span> <span>代理商管理</span></h4>
                    </div>
                </div>
            </div>
            <div class="my-title1">查询条件</div>
            <div class="col-md-12 clearfix">
                <div lass="panel" style="margin:10px 0;">
                    <div class="panel-body bg-white">
                        <table style="100%">
                            <tr class="row">
                                <td class="col-md-4">
                                    <label class="control-label">代理商名称</label>
                                    <div class="form-group">
                                        <input type="text" class="form-control" id="AgentName">
                                    </div>
                                </td>
                                <td class="col-md-4">
                                    <label class="control-label">上级代理商名称</label>
                                    <div class="form-group">
                                        <input type="text" class="form-control" id="ParentAgentName">
                                    </div>
                                </td>
                                <td class="col-md-4">
                                    <label class="control-label" for="Name">是否为任意通返利代理商</label>
                                    <div class="form-group">
                                        <select class="form-control" id="IsRebate">
                                            <option value="-1">请选择</option>
                                            <option value="1"></option>
                                            <option value="0"></option>
                                        </select>
                                    </div>
                                </td>
                                <td class="col-md-4"></td>
                            </tr>
                            <tr>
                                <td colspan="3">
                                    <input type="button" class="btn btn-primary" value="查询" id="selData">
                                </td>
                            </tr>
                        </table>

                    </div>
                </div>
            </div>
            <div class="my-title1">代理商列表</div>
            <div class="col-md-12 mt10">
                <div class="panel">
                    <div class="panel-body">
                        <div class="responsive-table" style="100%;overflow:auto;">
                            <div class="table-title-btn-wrap">
                                <div class="table-title-btn-box">

                                    <input type="button" class="btn btn-primary" value="添加" id="addnew" v-on:click="goToadd(0);">
                                </div>
                            </div>
                            <table class="table table-striped table-bordered" cellspacing="0">
                                <thead>
                                    <tr>
                                        <th style="min-80px;">ID</th>
                                        <th style="min-100px;">代理商名称</th>
                                        <th style="min-100px;">上级代理商名称</th>
                                        <th style="min-80px;">是否为任意通返利代理商</th>
                                        <th style="min-100px;">创建时间</th>

                                        <th style="min-100px;">创建人</th>
                                        <th style="min-100px;">最后操作时间</th>
                                        <th style="min-100px;">最后操作人</th>

                                        <th style="min-80px;">操作</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <tr class="Js_tableDataList">
                                        <td>{Id}</td>
                                        <td>{AgentName}</td>
                                        <td>{ParentAgentName}</td>

                                        <td>{IsRebate}</td>
                                        <td>{CreateTime}</td>

                                        <td>{CreateUserName}</td>
                                        <td>{UpdateTime}</td>

                                        <td>{UpdateUserName}</td>
                                        <td>
                                            <input type="button" class="btn btn-primary js_editOrPreview" value="编辑" data-id="{Id}" data-type="edit" v-on:click="editOrPreview('edit',{Id});">
                                            <input style="margin-left:15px;" type="button" class="btn btn-primary js_editOrPreview" value="查看详情" data-id="{Id}" data-type="preview" v-on:click="editOrPreview('preview',{Id});">
                                        </td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                        <div class="col-md-12">
                            <ul class="pagination pull-right">
                                <li class="list_page_box">

                                    <div class="" style="position:absolute;left:0px;top:20px;">
                                        <select style="100px;padding:5px;margin-right:10px;" id="exchangePageSize">
                                            <option value="10">每页10条</option>
                                            <option value="20">每页20条</option>
                                            <option value="30">每页30条</option>
                                            <option value="40">每页40条</option>
                                            <option value="50">每页50条</option>
                                        </select><a href="javascript:void(0)" class="pagCount" style="margin-left:5px;"></a>页,
                                        <a href="javascript:void(0)" class="js_RecCount" style="margin-left:5px;"></a></div>
                                    <a href="javascript:void(0)" class="pagFirst">首页</a>
                                    <a href="javascript:void(0)" class="pagPre"><span aria-hidden="true">&laquo;</span></a>
                                    <a href="javascript:void(0)" class="pagNum active">1</a>

                                    <a href="javascript:void(0)" class="pagNext"><span aria-hidden="true">&raquo;</span></a>
                                    <a href="javascript:void(0)" class="pagLast"><span aria-hidden="true">尾页</span></a>
                                </li>
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div v-show="!IsShow" class="part_box" style="display:none;">
            <div class="panel box-shadow-none content-header">
                <div class="panel-body">
                    <div class="col-md-12">
                        <h4 class="animated fadeInLeft" style="margin:0px;margin-top:5px; padding:0px;"><span>风控管理</span> <span class="fa-angle-right fa"></span> <span>代理商管理</span></h4>
                    </div>
                </div>
            </div>
            <div class="col-md-12 mt10">
                <div class="panel">
                    <div class="my-title2">代理商信息</div>
                    <div class="panel-body">
                        <table style="100%">
                            <tr>

                                <td class="col-md-6" style="height:72px;">
                                    <div id="covDatgeWrap" style="height:27px;">
                                        <div class="form-group form-animate-text " style="margin-top:-1px !important;">
                                            <input type="text" class="form-text mask-money " required="" id="AgentName_form" autocomplete="off">
                                            <span class="bar"></span>
                                            <label class="label">代理商名称</label>
                                        </div>
                                    </div>
                                </td>
                            </tr>
                            <tr>
                                <td class="col-md-6">
                                    <label class="control-label label3">是否有上级代理商</label>
                                    <div class="form-group">
                                        <select id="IsHaveParent" name="IsHaveParent" class="dropdown-toggle form-control no_border2">
                                            <option value="1"></option>
                                            <option value="0"></option>
                                        </select>
                                    </div>
                                </td>
                                <td class="col-md-6" v-show="isHaveParent==1">
                                    <div class="form-group form-animate-text select-box2" style="margin-top:10px !important;">
                                        <input type="text" class="form-text mask-money" required="" id="ParentAgentName_form" placeholder="" style="height: 50px;">
                                        <span class="bar"></span>
                                        <label class="label select-label default">上级代理商</label>
                                    </div>
                                </td>
                            </tr>
                            <tr>
                                <td class="col-md-6">
                                    <label class="control-label label3">是否为任意通返利代理商</label>
                                    <div class="form-group">
                                        <select id="IsRebate_form" name="IsRebate" class="dropdown-toggle form-control no_border2">
                                            <option value="1"></option>
                                            <option value="0"></option>
                                        </select>
                                    </div>
                                </td>
                                <td class="col-md-6" style="height:72px;" v-show="isRebate==1">
                                    <div id="covDatgeWrap">
                                        <div class="form-group form-animate-text " style="margin-top:-1px !important;margin-bottom:-12px !important">
                                            <input type="text" class="form-text mask-money ChoiceTime" required="" id="RebateDate" autocomplete="off">
                                            <span class="bar"></span>
                                            <label class="label">返利起始日期</label>
                                        </div>
                                    </div>
                                </td>
                            </tr>
                            <tr></tr>
                        </table>
                    </div>
                </div>
            </div>
            <div>
                <div class="col-md-12 mt10" id="panelContent">

                    <div class="panel  clearfix">
                        <div class="my-title2">业务联系人信息</div>
                        <div class="panel-body jspanel">
                            <div id="PanelEidt" style="padding-left:0px;" class="col-md-12">
                                <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">
                                    <input type="text" class="form-text mask-money ConName" required="">
                                    <span class="bar"></span>
                                    <label>姓名</label>
                                </div>
                                <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">
                                    <input type="text" class="form-text mask-money Phone" required="">
                                    <span class="bar"></span>
                                    <label>手机</label>
                                </div>
                                <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">
                                    <input type="text" class="form-text mask-money Email" required="">
                                    <span class="bar"></span>
                                    <label>邮箱</label>
                                </div>
                                <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">
                                    <input type="text" class="form-text mask-money QQNum" required="">
                                    <span class="bar"></span>
                                    <label>QQ/微信</label>
                                </div>
                            </div>
                        </div>
                        <div>
                        </div>
                    </div>

                </div>
                <input type="button" value="添加联系人" id="AddConMan" style="float:right;margin:6px 15px ;margin-right:43px;" class="btn btn-primary" v-show="!currentPreviewId">
            </div>

            <div class="col-md-12 mt10">
                <div class="panel">
                    <div class="panel-body"  v-show="!currentPreviewId">
                        <input type="button" value="提交" id="AddBtn" class="btn btn-primary" v-on:click="agentSave();" v-show="!currentEditId" />
                        <input type="button" value="确定" id="AddBtn" class="btn btn-primary" v-on:click="agentSave();" v-show="currentEditId" />
                        <input type="button" value="返回" id="backBtn" class="btn btn-primary" style="margin-left:20px;" v-on:click="backBtn();" />

                    </div>
                    <div class="panel-body" v-show="currentPreviewId">
                        <input type="button" value="返回" id="backBtn" class="btn btn-primary" style="margin-left:20px;" v-on:click="backBtn();" />

                    </div>
                    
                </div>
                <div style="height:100px;"></div>
            </div>
        </div>



    </div>
    <script type="text/javascript">
        $(function () {
            
            //列表相关-----start
            var exchangePageSize = localStorage.getItem('exchangePageSize') || 10; ///modify
            $("#exchangePageSize").val(exchangePageSize)

            var serchParams = {
                AgentName: $("#AgentName").val(),
                ParentAgentName: $("#ParentAgentName").val(),
                IsRebate: $("#IsRebate").val()
            }
            DataPagingTableDataList(serchParams, exchangePageSize);
            $("body").on('click', '#selData', function () {
                var exchangePageSize = localStorage.getItem('exchangePageSize') || 10; ///modify
                $("#exchangePageSize").val(exchangePageSize)
                var serchParams = {
                    AgentName: $("#AgentName").val(),
                    ParentAgentName: $("#ParentAgentName").val(),
                    IsRebate: $("#IsRebate").val()
                }
                DataPagingTableDataList(serchParams, exchangePageSize);
                //setInputsValueToStorge(); //设置值
            });

            $("#exchangePageSize").change(function () {
                var exchangePageSize = $("#exchangePageSize").val();
                var serchParams = {
                    AgentName: $("#AgentName").val(),
                    ParentAgentName: $("#ParentAgentName").val(),
                    IsRebate: $("#IsRebate").val()
                }
                DataPagingTableDataList(serchParams, exchangePageSize);
                localStorage.setItem('exchangePageSize', exchangePageSize) ///add
            });
        })
        
        //消息翻页
        function DataPagingTableDataList(params, exchangePageSize) {
           
            _dataPaging = new CmnAjax.DataPaging(".Js_tableDataList", "/Agent/GetAgentList", params, ".list_page_box", exchangePageSize, function (data) {
                $('.js_RecCount').html(data.RecCount)
                window.parent.postMessage("dataLoadSuccess", '*');
            }, function (data) { //填充数据之前的处理
                $.each(data.data, function (i, item) {
                    if (item.IsRebate == "1") {
                        item.IsRebate = "";
                    }
                    else if (item.IsRebate == "0") {
                        item.IsRebate = "";
                    }
                });
            });
            _dataPaging.Paging.ActiveClass = "active";
            _dataPaging.Paging.SetCycleNextPre(true);
        }

        function createContactList() {
            $("#panelContent").append("<div class='panel jspanel js_clonejspanel'> " +
                                           " <div class='panel-body'>" +
                                               "<div id="PanelEidt" style="padding-left:0px;" class="col-md-12">" +
                                    "                            <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">" +
                                    "                                <input type="text" class="form-text mask-money ConName" required="">" +
                                    "                                <span class="bar"></span>" +
                                    "                                <label>姓名</label>" +
                                    "                            </div>" +
                                    "                            <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">" +
                                    "                                <input type="text" class="form-text mask-money Phone" required="">" +
                                    "                                <span class="bar"></span>" +
                                    "                                <label>手机</label>" +
                                    "                            </div>" +
                                    "                            <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">" +
                                    "                                <input type="text" class="form-text mask-money Email" required="">" +
                                    "                                <span class="bar"></span>" +
                                    "                                <label>邮箱</label>" +
                                    "                            </div>" +
                                    "                            <div class="form-group form-animate-text col-md-6" style="margin-top:10px !important;">" +
                                    "                                <input type="text" class="form-text mask-money QQNum" required="">" +
                                    "                                <span class="bar"></span>" +
                                    "                                <label>QQ/微信</label>" +
                                    "                            </div>" +
                                    "                        <input type='button' value='删除联系人' onclick='DelPanel(this)' class='btn btn-primary mt10 js_clone_delect' style='float:right;' /></div>" +
                                           "</div>" +
                                      " </div>")
        }
        $("body").on('click', '#AddConMan', function () {
            if ($(".jspanel").length >= 4) {
                layer.msg('不能再添加更多了。')
                return false;
            }
            createContactList()
            //刷新页面高度
            window.parent.postMessage({ "dataLoadSuccess": "true" }, '*');
        });

        function DelPanel(doc) {
            var Obj = $(doc).closest(".jspanel");
            Obj.remove();
            window.parent.postMessage({ "dataLoadSuccess": "true" }, '*');
        }
       
       // function initVue() {
            //列表相关-----end
            //全局定义编辑器相关变量

            //var curPageIndex = null;
            var CustomerNameSelectPage = null;
            //初始化vue节点
            var vm = new Vue({
                el: '#myMenu',
                data: {
                    IsShow: true,
                    currentEditId: null,
                    currentPreviewId:null,
                    curPageIndex: null,
                    isHaveParent: 1,
                    isRebate: 1,
                },
                mounted: function () {
                    this.editOrPreview();
                    this.initDomEvent();
                },
                methods: {
                    agentSave: function (type) {
                        var that = this;
                        var scrollTop = $(window.parent.document).scrollTop() + 200;

                        var AgentName = $.trim($("#AgentName_form").val());
                        var IsHaveParent = $.trim($("#IsHaveParent").val());
                        var ParentID = $.trim($("#ParentAgentName_form").val());
                        var IsRebate = $.trim($("#IsRebate_form").val());
                        var RebateDate = $.trim($("#RebateDate").val());

                        if (!AgentName) {
                            layer.msg("请输入代理商");
                            return;
                        }
                        if (IsHaveParent == 1 && !ParentID) {
                            layer.alert('请输入上级代理商', { offset: scrollTop + 'px' });
                            return;
                        }
                        if (IsRebate == 1 && !RebateDate) {
                            layer.alert('请输入返利起始日期', { offset: scrollTop + 'px' });
                            return;
                        }
                        if (IsRebate == 1) {
                            //var _getNowDate = getNowDate();
                            
                            var getNowDateTime = new Date(getNowDate()).getTime();
                            var rebateDateTime = new Date(RebateDate).getTime();
                            if (rebateDateTime - getNowDateTime < 0) {
                                layer.alert('选择的返利起始日期必须大于等于今天', { offset: scrollTop + 'px' });
                                return;
                            }
                        }
                        var data = [];
                        $(".jspanel").each(function (i, item) {
                            var obj = {
                                ConName: $(item).find('.ConName').val(),
                                Phone: $(item).find('.Phone').val(),
                                Email: $(item).find('.Email').val(),
                                QQNum: $(item).find('.QQNum').val()
                            }
                            data.push(obj)
                        })
                        var params = {
                            AgentName: AgentName,
                            IsHaveParent: IsHaveParent,
                            IsRebate: IsRebate,
                            ParentID: ParentID,
                            RebateDate: RebateDate,
                            Data: data
                        }
                        var url = '/Agent/AgentAddSave';
                        if (this.currentEditId) { //如果currentEditId存在表示编辑
                            params.id = this.currentEditId;
                            url = '/Agent/AgentUpdateSave'
                        }
                        $.ajax({
                            url: url,
                            data: params,
                            type: 'post',
                            success: function (data) {
                                if (data.result) {
                                    layer.msg(data.msg, { offset: scrollTop + 'px' });
                                    //返回列表并刷新
                                    that.IsShow = true
                                    var exchangePageSize = localStorage.getItem('exchangePageSize') || 10; ///modify
                                    $("#exchangePageSize").val(exchangePageSize)
                                    DataPagingTableDataList({ EmailType: $("#EmailSendType").val() }, exchangePageSize);
                                    if (that.currentEditId && that.curPageIndex) {//如果是是编辑且列表不是在第一页就跳转到当前页
                                        setTimeout(function () {
                                            $('.list_page_box .pagNum').eq(that.curPageIndex).trigger('click')
                                        }, 200)
                                    }
                                } else {
                                    layer.msg(data.msg);
                                }
                            }
                        });
                    },
                    editOrPreview: function (type,id) {
                        var that = this;
                        //翻页列表中元素绑定不了vue click事件,应为绑定的时候dom还没有渲染出来--->在列表渲染之后初始化vue解决,,但这样会造成一个潜在问题。。vue会在列表多次渲染的多次初始化
                        $('body').on('click', '.js_editOrPreview', function () {
                            that.IsShow = false;

                            var id = $(this).data('id');
                            var type = $(this).data('type');
                            var params = {
                                id: id
                            }
                            if (type == 'edit') {
                                that.currentEditId = params.id;
                            } else if (type == 'preview') {
                                that.currentPreviewId = id;
                            }
                            
                            $.ajax({
                                url: '/Agent/GetAgentInfo',
                                type: 'post',
                                data: params,
                                datatype: 'json',
                                success: function (data) {
                                    that.IsShow = false; //显示修改界面
                                    that.initAddOrEdit();
                                    that.setFormValue(data)
                                    that.currentPreviewId && that.disablePreviewForm();
                                    
                                    window.parent.postMessage("dataLoadSuccess", '*');
                                    that.curPageIndex = $('.list_page_box .pagNum.active').index() - 3; //list_page_box的第3个元素才是pagNum第一个1个
                                }
                            });
                        });
                    },
                    disablePreviewForm: function () {
                        $('#panelContent,#covDatgeWrap').addClass('disabled');
                        $("select").prop("disabled", true);
                        $('.js_clone_delect').remove();
                        //禁用selectPage.js创建的下拉,使用延时的原因是创建下拉需要一定的时间,等他创建完成再去修改
                        setTimeout(function () {
                            $('#ParentAgentName_form').selectPageDisabled(true);
                            $('#ParentAgentName_form').closest('.sp_container').removeClass('sp_disabled');
                        }, 500)
                    },
                    initDomEvent: function () {
                        var that = this;
                        $('body').on('change', '#IsHaveParent', function () {
                            that.isHaveParent = $(this).val();
                        });
                        $('body').on('change', '#IsRebate_form', function () {
                            that.isRebate = $(this).val();
                        });
                    },
                    backBtn: function () {
                        this.IsShow = true; //返回列表
                        $('.js_clonejspanel').remove();
                        $('#panelContent,#covDatgeWrap').removeClass('disabled');

                        $("select").prop("disabled", false)
                        $('#ParentAgentName_form').selectPageDisabled(false);

                        this.currentPreviewId = null;
                        this.currentEditId = null;
                        window.parent.postMessage("dataLoadSuccess", '*');
                    },
                    goToadd: function (type) {
                        this.IsShow = false; //显示新增界面
                        this.initAddOrEdit();
                        //清空表单
                        this.clearForm()
                        this.currentEditId = null;
                        window.parent.postMessage("dataLoadSuccess", '*');

                        if (!CustomerNameSelectPage) {//避免重复创建
                            this.getSelectBoxData(function (data) {
                                CustomerNameSelectPage = $('#ParentAgentName_form').selectPage({
                                    showField: 'Name',
                                    keyField: 'ID',
                                    pagination: false,
                                    maxSelectLimit: 10, //限制最多选择个数
                                    data: data
                                });
                            })
                        }
                    },
                    initAddOrEdit: function () { //元素显示后再去创建第三方插件调用
                        $('.ChoiceTime').datetimepicker({
                            format: 'yyyy-mm-dd',
                            weekStart: 1,
                            todayBtn: 1,
                            autoclose: true,
                            todayHighlight: 1,
                            startView: 2,
                            minView: 2,
                            forceParse: 0,
                        });
                    },
                    clearForm: function () {
                        $('#AgentName_form').val('');
                        $('#IsHaveParent').val('1');
                        //$('#ParentAgentName_form').val('');
                        $('#ParentAgentName_form').selectPageClear();
                        $('#IsRebate_form').val('1');
                        $('#RebateDate').val('');
                        this.isHaveParent = 1;
                        this.isRebate = 1;

                        $('.jspanel').find('input').val('');
                    },
                    setFormValue: function (value) {
                        if (!CustomerNameSelectPage) {//避免重复创建
                            this.getSelectBoxData(function (data) {
                                CustomerNameSelectPage = $('#ParentAgentName_form').selectPage({
                                    showField: 'Name',
                                    keyField: 'ID',
                                    pagination: false,
                                    maxSelectLimit: 10, //限制最多选择个数
                                    data: data
                                });
                            })
                        }
                        $('#AgentName_form').val(value.AgentName);
                        $('#IsHaveParent').val(value.IsHaveParent);
                        $('#ParentAgentName_form').val(value.ParentID);
                        $('#ParentAgentName_form').selectPageRefresh(); //设置val后需要刷新列表

                        $('#IsRebate_form').val(value.IsRebate);
                        $('#RebateDate').val(value.RebateDate);

                        this.isHaveParent = value.IsHaveParent;
                        this.isRebate = value.IsRebate;
                        //遍历创建n个、
                        // 。。
                        var dataLen = value.Data.length;
                        while (dataLen > 1) {
                            createContactList();
                            dataLen--;
                        }
                        if (dataLen >= 1) {

                            $.each(value.Data, function (i, item) {
                                $.each(item, function (key, iitem) { // key
                                    $('body').find('.jspanel').eq(i).find('.' + key).val(iitem)
                                });
                            });
                        }
                        //fixed ui style
                        $('#ParentAgentName_form').siblings('label').css({ 'top': '7px', 'font-size': '14px' });
                    },
                    getSelectBoxData: function (cb) {
                        $.ajax({
                            url: '/CustomerBillManage/GetAgent',
                            datatype: 'json',
                            type: "post",
                            success: function (data) {
                                cb && cb(data);
                            }
                        });
                    },
                },
                filters: {
                    formateProductType: function (val) {

                        if (val == 1) {
                            val = '30天产品';
                        } else if (val == 2) {
                            val = '45天产品';
                        } else if (val == 3) {
                            val = '60天产品';
                        }
                        return val
                    }
                }
            });
      //  }
        
    </script>
</body>
</html>
View Code

注意我们最后的页面是使用jQuery与vue混合的,其中翻页部分是使用jQuery插件渲染的,其他部分是使用vue+jQuery的

思路

直接当前页面中引入vue.js script标签,通过对右侧节点`#myMenu`创建一个 Vue 实例,直接把当前页面当做template

- 方案1.非component组件化

直接页面内使用

var vm = new Vue({

el: '#myMenu',

data: {

IsShow: true,

},

created: function () {

console.log('xx');

},

methods: {}

})

- 方案2.component组件化

新建一个test.js文件,然后当前页面引入这个test.js文件,当做组件注册到页面中去使用

Vue.component('my-test', {

template: '<div> test HTML 代码 {{mgs}}{{title}}</div>',

props: {

title: { default: 'xxx' }

},

data: function () {

return {

mgs: 'testttt'

}

},

created: function () {

console.log(this.mgs);

},

methods: {}

// ...

})
原文地址:https://www.cnblogs.com/ruoqiang/p/11211970.html