Flask template+Vue +项目中include引入其他模版(其他模版也会用到vue)的使用探索

项目背景是:团队的历史项目,是flask tmeplate写的前段页面。然后我在一个页面A.html中引入了vue文件,使用了vue+element_ui技术。现在想在此A页面中插入另外一个页面B.html的内容(试图tab分开),因为入口只有A页面作为入口,想要在B.html中实现不同与A的功能。

尝试1,html文件中可以存在多个vue实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <script src="{{ url_for('static', filename='js/vue.js') }}" type="text/javascript"></script>
        <script src="{{ url_for('static', filename='js/axios.min.js') }}" type="text/javascript"></script>

        <!-- 引入样式 -->
     <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
{{done}}
    <div id="app">

        <h1>
        {{ "{{" }} msg {{ "}}" }}</h1>
        <div>hello</div>
    </div>
    <div id="app-body">
        <h4>

        {{ "{{" }} title {{ "}}" }}</h4>
        <div>hello</div>
    </div>
    <div class="app-footer">
        <h4>
        {{ "{{" }} footer {{ "}}" }}</h4>
        <div>hello</div>
    </div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: function () {
                return {
                    msg: "前段vue使用",
                }
            }
        });
</script>
    <script>
        const vmBody = new Vue({
            el: '#app-body',
            data: function () {
                return {
                    title: "vue实例2"
                }
            }
        });
</script>
    <script>
        const vmFooter = new Vue({
            el: '.app-footer',
            data: function () {
                return {
                    footer: "vue实例3",
                }
            }
        });
</script>
</body>
</html>

前端:

但是全都写到一起,虽然可以分为两个vue实例来处理,但是不想两个功能的html代码和vue代码参和在一个文件中,导致一个文件太大太乱。 

尝试2,可以通过 flask template的jinjia语法 include来引入外部模块 (注意此种用法不是很大众,出现了问题,并未解决,急需大牛帮我看看问题所在,不胜感激!!)

比如在A.html中的某个位置

{% include './new_module/B.html' %}

导入B的内容。A.html内容如下:

div id="order">
  <el-tabs type="border-card" v-model="active_tab_name">
        <el-tab-pane name="pc_side">
            <span slot="label" class="order_tab_title"><i class="el-icon-s-platform
"></i> A部门工单申请</span>
            <div id="main_index">  
                      
                          A页面的主要内容

           </div>
</el-tab-pane>
        <el-tab-pane  name="">
        <span slot="label" class="order_tab_title"><i class="el-icon-search
"></i> B部门工单申请</span>
   {% include './order_manage/param_test.html' %}

 </el-tab-pane>
    </el-tabs>

注意:导入的内容是无法解析<script>标签的。若B.html的内容如下存在script标签。


<div id="param_order_search">
        <div>
        <el-form ref="form" :model="form" label-width="80px">
             <el-form-item label="活动名称">
    <el-input v-model="form.name"></el-input>
  </el-form-item>

            <el-form-item>
    <el-button type="primary" @click="is_test_method()">立即创建sss</el-button>
    <el-button type="primary" @click="bye_msg='bye2bye2'">立即创建222</el-button>
    <el-button>取消</el-button>
  </el-form-item>

        </el-form>
    </div>
    <div>
          再见再见 {{"{{"}} bye_msg {{"}}"}}

   </div>
</div>



<script>
     var create_param_search = new Vue({
            el: "#param_order_search",
            data: function () {
                return {
                    sub_msg: "感谢阅读",
                    bye_msg: "bye bye",
                    form:{
                        name:"参数名称"
                    }
                }
            },
               mounted:function (){
                console.log("create_param_search mounted")
                this.is_test_method()
               },
              methods:{
                is_test_method(){
                    console.log("is_test_method")
                }
              }
        })
</script>

出现的错误如下: 

vue.js:634 [Vue warn]: Error compiling template:

Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side-effects in your templates, such as <script>, as they will not be parsed

于是想了迂回的方法:使用 template 的jinjia方法:macro

如是B.html变为:

<div id="param_order_search">
        <div>
        <el-form ref="form" :model="form" label-width="80px">
             <el-form-item label="活动名称">
    <el-input v-model="form.name"></el-input>
  </el-form-item>

            <el-form-item>
    <el-button type="primary" @click="is_test_method()">立即创建sss</el-button>
    <el-button type="primary" @click="bye_msg='bye2bye2'">立即创建222</el-button>
    <el-button>取消</el-button>
  </el-form-item>

        </el-form>
    </div>
    <div>
          再见再见 {{"{{"}} bye_msg {{"}}"}}

   </div>
</div>

{% macro create_param_search() %}

          var create_param_search = new Vue({
            el: '#param_order_search',
            data: function () {
                return {
                    sub_msg: "感谢阅读",
                    bye_msg: "bye bye",
                    form:{
                        name:"参数名称"
                    }
                }
            },
             template:"#tem",
               mounted:function (){
                console.log("create_param_search mounted")
                is_test_method()
               },
              methods:{
                is_test_method(){
                    console.log("is_test_method")
                }
              }
        })
{% endmacro %}

在A.html的scipt中(与第一个vue实例一起的script中)

于是A.html的script变为:

 <script>

 {% from "./order_manage/param_test.html" import create_param_search %}
        {{ create_param_search() }}
 

        var order= new Vue({
            el: "#order",
            data: {
               ........
</script>

页面也能正常加载

查看页面源码,发现B.hmtl的代码已经加载进入A.html中,但是控制台查看元素中button中是没有绑定相关click代码的。

  <el-tab-pane >
        <span slot="label" class="order_tab_title"><i class="el-icon-search
"></i> B部门工单申请</span>




                    


<div id="param_order_search">
        <div>
        <el-form ref="form" :model="form" label-width="80px">
             <el-form-item label="活动名称">
    <el-input v-model="form.name"></el-input>
  </el-form-item>

            <el-form-item>
    <el-button type="primary" @click="is_test_method()">立即创建sss</el-button>
    <el-button type="primary" @click="bye_msg='bye2bye2'">立即创建222</el-button>
    <el-button>取消</el-button>
  </el-form-item>

        </el-form>
    </div>
    <div>
          再见再见 {{ bye_msg }}

   </div>
</div>


 ......

 <script>
          var create_param_search = new Vue({
            el: '#param_order_search',
            data: function () {
                return {
                    sub_msg: "感谢阅读",
                    bye_msg: "bye bye",
                    form:{
                        name:"参数名称"
                    }
                }
            },
               mounted:function (){
                console.log("create_param_search mounted")
                is_test_method()
               },
              methods:{
                is_test_method(){
                    console.log("is_test_method")
                }
              }
        })

        
        
     

        var order= new Vue({
            el: "#order",
            data: {
                    ......
</script>

但是出现了问题:方法无法调用!!!至今没找到解决办法

点击页面的按钮,方法没有被调用,隐约觉得原因是因为include加载模块后渲染没有识别vue的代码写法丢弃了。但是为啥能识别elment_ui的写法呢?不解....

尝试3,使用import导入script vue代码,然后vue实例加载template模版

此种方法B.html内容是:


<template id="param_order_search">
    <div >
        <div>
        <el-form ref="form" :model="form" label-width="80px">
             <el-form-item label="活动名称">
    <el-input v-model="bye_msg"></el-input>
  </el-form-item>

            <el-form-item>
    <el-button type="primary" @click="is_test_method()">立即创建sss</el-button>
    <el-button type="primary" @click="bye_msg='bye2bye2'">立即创建222</el-button>
    <el-button>取消</el-button>
  </el-form-item>

        </el-form>
    </div>
    <div>
          再见再见 {{"{{"}} bye_msg {{"}}"}}

   </div>
</div>
</template>

{% macro create_param_search() %}

          var create_param_search = new Vue({
            el: '#param_order_search_top',
            data: function () {
                return {
                    sub_msg: "感谢阅读",
                    bye_msg: "bye bye",
                    form:{
                        name:"参数名称"
                    }
                }
            },
               mounted:function (){
                console.log("create_param_search mounted")
                this.is_test_method()
               },
              methods:{
                is_test_method(){
                    console.log("is_test_method")
                }
              }
        })
{% endmacro %}

 A.html中展示B内容的区域的代码为:

 <div id="param_order_search_top">
                 下面是挑战性内容哦!!
                            <create_param_search></create_param_search>

            </div>

.......

 <script>
 {% from "./order_manage/param_test.html" import create_param_search %}
        {{ create_param_search() }}

var order= new Vue({
            el: "#order",
            data: {
.....

结果就是报错:

Unknown custom element: <create_param_search> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

(found in <Root>)

应该是 模版渲染+vue解析 时机和import代码解析时机是有时差的,所以导致没发现import的vue代码

尝试4:目前看下来是可行的。使用iframe来加载B.html到A.html中,b。html中写html代码及js代码。

可参考我的另外一篇博客:

Flask template中使用iframe-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/238368.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cython笔记:基本使用方法

1 Cython 介绍 Cython 是一种编程语言&#xff0c;用于编写 C 扩展的 Python 模块。它结合了 Python 的易用性和 C 的执行效率&#xff0c;旨在提高特定类型的任务的性能&#xff0c;特别是涉及大量数值计算的任务。 1.2 几个特征 1.2.1 Python 语法的基础 Cython 的大部分语…

Echarts 折线图 颜色填充 标记点 相关设置

数据 const xData [小米, 三星, 苹果] const yData [2451, 5415, 4012]配置项 {xAxis: {type: category,data: xData},yAxis: {type: value},series: [{type: line, //设置折线图data: yData,}] }曲线图&#xff08;平滑过度&#xff09; smooth: true内容填充&#xff08;…

HTML如何使用图片链接

文章目录 图片链接的使用常见图片类型PNGJPGGIFBMP 图片链接的使用 在 HTML 中&#xff0c;图像由 标签定义。 是空标签&#xff0c;意思是说&#xff0c;它只包含属性&#xff0c;并且没有闭合标签。 语法&#xff1a; <img src”图片路径" title“鼠标悬浮在图片上…

甲醛处理企业网站效果如何

甲醛往往是新装房间主所担心的问题&#xff0c;而甲醛处理公司则可以处理甲醛问题&#xff0c;市场需求也比较高&#xff0c;虽然具备同城服务属性&#xff0c;但外地或连锁经营也非常适合&#xff0c;而品牌们也遇到一些痛点&#xff1a; 1、品牌宣传拓客难 甲醛处理公司也需…

AI数字人直播能力堪比真人涌入直播大军!

近几年&#xff0c;国内外电商直播产业飞速发展。相关报告显示&#xff0c;截至2022年12月&#xff0c;电商直播用户规模为5.15亿人次&#xff0c;占网民数量的48.2%&#xff0c;总结来说&#xff0c;近一半的网民都在各类直播间购买过商品。 但是随着直播行业不断发展&#xf…

14-Kafka-Day02

第 4 章 Kafka Broker 4.1 Kafka Broker 工作流程 4.1.1 Zookeeper 存储的 Kafka 信息 &#xff08;1&#xff09;启动 Zookeeper 客户端。 bin/zkCli.sh 因为你在配置kafka的时候指定了它的名字。 &#xff08;2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: …

【算法】算法题-20231211

这里写目录标题 一、387. 字符串中的第一个唯一字符二、1189. “气球” 的最大数量三、1221. 分割平衡字符串 一、387. 字符串中的第一个唯一字符 简单 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回…

C++ Qt开发:LineEdit单行输入组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍LineEdit单行输入框组件的常用方法及灵活运用…

加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)

文章目录 &#x1f680;前言&#x1f680;异或运算以及与运算&#x1f680;加法的实现&#x1f680;减法的实现&#x1f680;乘法的实现&#x1f680;除法的实现 &#x1f680;前言 这也是阿辉开的新专栏&#xff0c;知识将会很零散不成体系&#xff0c;不过绝对干货满满&…

算法通关村——滑动窗口高频问题

滑动窗口之最长子串 无重复字符的最长子串 LeetCode3. 给定一个字符串s&#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例&#xff1a; 输入&#xff1a;s “abcabcbb” 输出&#xff1a;3 解释&#xff1a;因为无重复字符的最长子串是"abc"&#…

Socket介绍及使用Java实现socket通信前后端示例代码

本文介绍一下再Java中Socket的实现。 目录 一、需要掌握 二、程序源码 三、运行演示 一、介绍 Java Socket实现实时接收TCP消息需要客户端和服务端两个部分。 二、JavaSocket源码示例 客户端后台部分代码 public class Client {public static void main(String[] args)…

【亚马逊云科技】使用Vscode - Q完成GUI界面粉笔脚本开发

前言 亚马逊云科技-Q&#xff0c;可以快速获得紧迫问题的相关答案&#xff0c;解决问题&#xff0c;生成内容。当与Q 聊天时&#xff0c;它会提供即时的相关信息和建议&#xff0c;以帮助简化任务、加快决策速度&#xff0c;并帮助激发工作中的创造力和创新。本次我们通过完整…

初始集合框架+时间和空间复杂度(数据结构)

【本节目标】 1. 什么是集合框架 2. 集合框架的重要性 3. 背后所涉及的数据结构 【本节目标】 1. 算法效率 2. 时间复杂度 3. 空间复杂度 1. 什么是集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0c;是定义在 java.util 包…

京东数据分析(京东大数据运营):10月取暖器行业迎来消费热潮,销额环比增长约570%!

随着气温降低&#xff0c;御寒用品开始热销。 气温的下降对取暖器的销售有明显的拉动效果&#xff0c;环比来看&#xff0c;10月份取暖器的销量销额均呈现三位数增长。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台取暖器的销量将近28万&#xff0c;环比增长572%&am…

Nacos配置管理-配置热更新

目录 一、Nacos配置管理回顾 1.1 统一配置管理 1.1.1 在nacos中添加配置文件 1.1.2 在弹出的表单中&#xff0c;填写配置信息 1.1.3 从微服务拉取配置 1.1.4 在项目中新增一个配置文件bootstrap.yaml&#xff0c;内容如下&#xff1a; 1.1.5 读取nacos配置 1.1.6 效果 二…

【算法题】数字字符串组合倒序 (js)

解法&#xff1a; const str "I am an 20-years out--standing * -stu- dent";function solution(str) {const arr str.split(" ");const newArr arr.map((str) > {if (/[a-zA-Z0-9-]/.test(str)) {if (/-{2}/g.test(str)) {return str.replace(/-…

vue安装与配置

node node.js的下载&#xff1a;https://nodejs.org/dist 在项目中可能会有版本冲突&#xff0c;这里可以选择自己想要的版本下载&#xff0c;而且一台电脑可以同时安装多个版本的node。当你需要切换版本时直接去更改环境变量即可。下面我安装选择的是压缩包&#xff0c;压缩包…

SDXL使用animateDiff和hotshot-xl进行文生视频

截至2023.12.8号&#xff0c;目前市面上有两款适用于SDXL的文生视频开源工具&#xff0c;分别是AnimateDiff和hotshot-xl。 一、工具下载链接 &#xff08;1&#xff09;AnimateDiff的webui版本的git链接&#xff1a; GitHub - continue-revolution/sd-webui-animatediff: A…

vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能

实现效果&#xff1a; 功能实现&#xff1a; 要实现图片的拖拽功能首先需要安装vuedraggable库 npm install vuedraggable --save在组件中引入并注册 vuedraggable <script>import draggable from "vuedraggable";export default {// 注册组件components: {…

【神行百里】pandas查询加速之行索引篇

最近进行大数据处理的时候&#xff0c;发现我以前常用的pandas查询方法太慢了&#xff0c;太慢了&#xff0c;真是太慢了&#xff0c;查阅资料&#xff0c;遂发现了一种新的加速方法&#xff0c;能助力我飞上天&#xff0c;和太阳肩并肩&#xff0c;所以记录下来。 1. 场景说明…