精华内容
下载资源
问答
  • vue动态渲染表格

    2021-03-25 19:50:48
    所以需要动态渲染个表格的列,如下图中2人团价格以及3人团价格表头 需求描述: 当后台管理员选择开团的类型后,所关联的参团商品设置sku时,会动态渲染参团类型所对应的价格。 如下图sku设置。 ![]...

    项目场景:

    拼团的后台项目,项目中需要设置参团的sku,也就是所开的这个团是几人的团,开团的人数不同,价格也就不同。所以需要动态渲染个表格的列,如下图中2人团价格以及3人团价格表头

    需求描述:

    当后台管理员选择开团的类型后,所关联的参团商品设置sku时,会动态渲染参团类型所对应的价格。 如下图sku设置。


    代码:

    <el-table
            ref="multipleTable"
            :data="skuTableData"
            tooltip-effect="dark"
            style="width: 100%"
            border
          >
            <el-table-column prop="id" label="SKU编号" width="120" align="center">
            </el-table-column>
            <el-table-column
              prop="sku_attr_text"
              label="规格"
              width="120"
              align="center"
            >
            </el-table-column>
            <el-table-column prop="address" label="价格" align="center">
            </el-table-column>
            <el-table-column prop="stock" label="库存" align="center">
            </el-table-column>
    
    		//动态渲染的表格列
            <el-table-column
              :label="item.val"
              v-for="(item, index) in tableHead"
              :key="index"
            >
              <template scope="scope">
                <el-input
                  size="small"
                  v-model="scope.row[item.item]"
                  placeholder="0"
                  type="number"
                ></el-input>
              </template>
            </el-table-column>
          </el-table>
    
    
    
    
    tableHead:[
    	{ val: "2人团价格", item: "target1" },
    	{ val: "3人团价格", item: "target2" },
    ]  是个数组
    
    
    skuTableData:[
    	{target1:1},
    	{target2:2}
    ]
    这个是表格的行数据 主要就是数据对应上
    

    展开全文
  • Selenium 是一个自动化测试工具,利用它可以驱动浏览器完成特定的操作,例如点击、下拉、拖动等,还可以获取浏览器当前呈现的页面的源代码,做到所见即所爬,对于一些 JavaScript 动态渲染的页面来说,这种爬取方式...

    一、安装 Selenium

    利用 Ajax 接口 爬取数据的方法通常有两种:

    1. 一种是深挖其中的逻辑,把请求需要的参数的构造逻辑完全找出来,在使用 Python 代码复现,构造 Ajax 请求;
    2. 另一种是直接模拟浏览器的运行,绕过这个过程,因为在浏览器里是可以看到这个数据的,所以如果能把看到的数据直接爬取下来,当然就能获取对应的信息了。

    两种方式各有优劣,具体采用哪一种,需要根据实际情况进行分析。举个简单例子:如果你的工作时间紧任务重,老板数据要得着急,网站请求参数构造的逻辑又相对复杂,我们可以采取第 2 种方式先拿到数据,性能什么的可以先暂时忽略。

    题外话:就我个人而言,并不太喜欢使用 Selenium。如果所有数据都依赖于 Selenium 进行抓取,性能太低,提供的 API 也并不是太稳定,并且现在针对 Selenium 特征检测的网站也不少,但是 Selenium 做一些辅助操作是非常好的。

    本文主要介绍第二种方法,模拟浏览器的运行,爬取数据。Selenium 是一个自动化测试工具,利用它可以驱动浏览器完成特定的操作,例如点击、下拉、拖动等,还可以获取浏览器当前呈现的页面的源代码,做到所见即所爬,对于一些 JavaScript 动态渲染的页面来说,这种爬取方式还是非常有效的。官方学习文档:https://selenium-python.readthedocs.io/installation.html

    在开始使用 Selenium 之前,要满足下面 3 个条件:

    (1) 确保你的电脑上已经正确安装好了浏览器。(建议:安装 Chrome 浏览器,后续博文也是以 Chrome 浏览器 讲解为主)。没有 Chrome 浏览器的读者,自行打开下面的百度网盘链接进行下载。

    链接:https://pan.baidu.com/s/1FpM6lXNf4nUoEtJrQVKHnw 
    提取码:k2s2 
    --来自百度网盘超级会员V7的分享
    

    (2) 正确安装好 Python 的 Selenium 库。命令如下:

    pip/pip3 install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com selenium
    

    (3) 安装一个 ChromeDriver。 不同平台安装的方式不太一样,这里以 WindowsMacOS 举例说明。

    1. 点击 Chrome 的菜单,帮助 ⇒ 关于 Chrome,即可查看 Chrome 的版本号,在这里我的版本是 96.0.4664.45,如图所示:
      在这里插入图片描述
      记住 Chrome 版本号,在后面选择 ChromeDriver 版本时需要用到。

    2. 下载 ChromeDriver。打开 ChromeDriver 的官方网站,链接为:https://sites.google.com/chromium.org/driver/downloads。官网打不开,参考下面其他下载地址进行下载:

      下载地址:https://sites.google.com/a/chromium.org/chromedriver/(官网)
      其他下载地址:https://chromedriver.storage.googleapis.com/index.html
      https://npm.taobao.org/mirrors/chromedriver/(自选一个)
      

      可以看到到目前为止最新支持的 Chrome 浏览器版本为 97,最新版本以官网为准,如图所示:
      在这里插入图片描述
      每个版本都有相应的支持 Chrome 版本介绍,请找好自己的 Chrome 浏览器版本对应的 ChromeDriver 版本再下载,否则可能导致无法正常工作。由于我这边的 ChromeDriver 版本是 96.0.4664.45,匹配方法:

      先是找第一个,96,一定要找到
      然后找第二个,0,一定要找到
      然后找第三个,4664,应该是有的
      最后找第四个,45:有就最好,直接点击去就是了。没有的话也没关系,找和45最靠近的,点进去。
      

      找到对应的下载列表,如图所示:
      在这里插入图片描述
      Windows 系统就下载 win32.zipMac 系统 Intel 芯片 下载 mac64.zipMac 系统 M1 芯片 下载 mac64_m1.zipLinux 系统下载 linux64.zip,下载解压之后会得到一个 ChromeDriver 的可执行文件。

    3. 下载完成后将 ChromeDriver 的可执行文件配置到环境变量下。在 Windows 下,建议直接将 chromedriver.exe 文件拖到 Python 的 Scripts 目录下,如图所示:
      在这里插入图片描述
      也可以单独将其所在路径配置到环境变量,环境变量的配置方法请自行解决。在 Linux、Mac 下,需要将可执行文件配置到环境变量或将文件移动到属于环境变量的目录里。例如移动文件到 /usr/bin 目录,首先命令行进入其所在路径,然后将其移动到 /usr/bin

      sudo mv chromedriver /usr/bin  备注:某些 Mac 电脑可能会遇到权限问题
      

      当然也可以将 ChromeDriver 配置到 $PATH,首先可以将可执行文件放到某一目录,目录可以任意选择,例如将当前可执行文件放在 /usr/local/chromedriver 目录下,接下来可以修改 ~/.profile 文件,命令如下:

      export PATH="$PATH:/usr/local/chromedriver"
      
      MacOS 推荐使用以下命令:
      cd Desktop   
      sudo cp chromedriver /usr/local/bin/chromedriver
      Password:
      ls /usr/local/bin | grep chromedriver
      chromedriver
      

      保存然后执行:即可完成环境变量的添加。

      source ~/.profile
      
    4. 验证安装。配置完成之后,就可以在命令行下直接执行 chromedriver 命令了。命令行下输入:

      chromedriver
      

      输入控制台有类似输出,如图所示:
      在这里插入图片描述
      如果有类似输出则证明 ChromeDriver 的环境变量配置好了。随后再在程序中测试,执行如下 Python 代码:

      # -*- coding: utf-8 -*-
      # @Time    : 2021/12/6 23:53
      # @Author  : AmoXiang
      # @FileName: selenium_test.py
      # @Software: PyCharm
      # @Blog    :https://blog.csdn.net/xw1680?
      
      from selenium import webdriver
      
      browser = webdriver.Chrome()
      

      运行之后会弹出一个空白的 Chrome 浏览器,证明所有的配置都没有问题,如果没有弹出,请检查之前的每一步的配置。如果弹出之后闪退,则可能是 ChromeDriver 版本和 Chrome 版本不简容,请更换 ChromeDriver 版本。如果没有问题,接下来我们就可以开始使用 Selenium 来实现所见即所爬了。Linux 系统,大佬请自己处理。

    二、Selenium 的使用

    1、基本用法:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 0:16
    # @Author  : AmoXiang
    # @FileName: demo1.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    browser = webdriver.Chrome()  # 初始化浏览器对象并赋值给 browser
    # webdriver.Firefox()
    # webdriver.Edge()
    # webdriver.Safari()
    try:
        # 向参数url传入要请求网页的URL即可
        browser.get(url="https://www.baidu.com")  # 使用get方法请求网页
        _input = browser.find_element_by_id("kw")  # 查找节点
        # 等价 _input = browser.find_element(By.ID, "kw")
        _input.send_keys("AmoXiang")  # 输入文字
        _input.send_keys(Keys.ENTER)
        wait = WebDriverWait(browser, 10)
        wait.until(EC.presence_of_all_elements_located((By.ID, "content_left")))
        print(browser.current_url)  # 获取当前页面的url
        print(browser.get_cookies())  # 获取cookie
        print(browser.page_source)  # 页面源码
    finally:
        browser.close()
    

    2、查找节点:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 0:38
    # @Author  : AmoXiang
    # @FileName: demo2.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    browser = webdriver.Chrome()
    browser.get('http://tjj.sc.gov.cn/scstjj/tjgb/common_list.shtml')
    # ############## 查找单个节点 ###############
    one = browser.find_element_by_id('list-data')
    two = browser.find_element_by_css_selector('#list-data')
    three = browser.find_element_by_xpath('//*[@id="list-data"]')
    # 等价于下面这个方法
    _one = browser.find_element(By.ID, 'list-data')
    print(one, two, three, _one)
    
    # ############## 查找多个节点 ###############
    lis = browser.find_elements_by_css_selector()
    # 等价于下面这个:
    # browser.find_elements(By.CSS_SELECTOR, '#list-data li')
    print(lis)
    browser.close()
    

    3、节点交互:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 0:52
    # @Author  : AmoXiang
    # @FileName: demo3.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    from selenium import webdriver
    import time
    
    browser = webdriver.Chrome()
    browser.get('http://tjj.sc.gov.cn/scstjj/tjgb/common_list.shtml')
    input_ = browser.find_element_by_id('searchWord')
    input_.send_keys('统计公报')
    time.sleep(1)
    input_.clear()
    time.sleep(3)
    input_.send_keys('决策预算')
    button = browser.find_element_by_id('searchbtn')
    button.click()
    browser.close()
    

    4、动作链:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 0:56
    # @Author  : AmoXiang
    # @FileName: demo4.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    import time
    
    browser = webdriver.Chrome()
    url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    browser.get(url)
    browser.switch_to.frame('iframeResult')
    source = browser.find_element_by_css_selector('#draggable')  # 获取拖拽的节点
    target = browser.find_element_by_css_selector('#droppable')  # 拖拽至目标节点
    actions = ActionChains(browser)
    actions.drag_and_drop(source, target)
    actions.perform()
    time.sleep(5)
    browser.close()
    

    5、运行 JavaScript:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 1:06
    # @Author  : AmoXiang
    # @FileName: demo5.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('http://tjj.sc.gov.cn/scstjj/tjgb/common_list.shtml')
    # 实际工作中,我们可能会计算每次拖动的距离
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    browser.execute_script('alert("To Bottom")')
    

    有了 execute_script() 方法,那些没有被提供 API 的功能几乎都可以用运行 JavaScript 的方式实现。

    6、获取节点信息:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 1:10
    # @Author  : AmoXiang
    # @FileName: demo6.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    url = 'http://tjj.sc.gov.cn/scstjj/tjgb/common_list.shtml'
    browser.get(url)
    logo = browser.find_element_by_xpath('//a[@class="logo"]/img')
    print(logo)
    # 使用get_attribute()方法获取属性,传入想要获取的属性名即可
    print(logo.get_attribute('src'))
    
    # TODO 2.获取文本值
    search_btn = browser.find_element_by_id("searchbtn")
    print(search_btn.text)
    # TODO 3.获取 ID、位置、标签名和大小
    print(search_btn.id)
    print(search_btn.location)
    print(search_btn.tag_name)
    print(search_btn.size)
    

    7、切换 Frame:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 1:19
    # @Author  : AmoXiang
    # @FileName: demo7.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    import time
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    
    browser = webdriver.Chrome()
    url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    browser.get(url)
    browser.switch_to.frame('iframeResult')
    try:
        logo = browser.find_element_by_class_name('logo')
    except NoSuchElementException:
        print('NO LOGO')
    browser.switch_to.parent_frame()
    logo = browser.find_element_by_class_name('logo')
    print(logo)
    print(logo.text)
    

    8、延时等待:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 1:22
    # @Author  : AmoXiang
    # @FileName: demo8.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    browser = webdriver.Chrome()
    # 隐式等待
    # browser.implicitly_wait(10)
    browser.get('http://tjj.sc.gov.cn/scstjj/tjgb/common_list.shtml')
    # input_ = browser.find_element_by_class_name('logo')
    # print(input_)
    # 显示等待
    wait = WebDriverWait(browser, 10)
    input_ = wait.until(EC.presence_of_element_located((By.ID, 'searchWord')))
    button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#searchbtn')))
    print(input_, button)
    

    9、前进和后退:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 1:37
    # @Author  : AmoXiang
    # @FileName: demo9.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    import time
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('http://tjj.sc.gov.cn/scstjj/tjgb/common_list.shtml')
    time.sleep(2)
    browser.get('http://tjj.sc.gov.cn/scstjj/tjgb/common_list_2.shtml')
    time.sleep(2)
    browser.get('http://tjj.sc.gov.cn/scstjj/tjgb/common_list_3.shtml')
    time.sleep(2)
    browser.back()
    time.sleep(3)
    browser.forward()
    time.sleep(3)
    browser.close()
    

    10、Cookie:

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.jd.com')
    print(browser.get_cookies())
    browser.add_cookie({'name': 'name',
                        'value': 'jd', 'domain': 'www.jd.com'})
    print(browser.get_cookies())
    browser.delete_all_cookies()
    print(browser.get_cookies())  # 大部分删除了,可能还剩下一些
    

    11、选项卡管理:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 1:42
    # @Author  : AmoXiang
    # @FileName: demo10.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    import time
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('window.open()')
    print(browser.window_handles)  # 获取当前开启的所有选项卡
    browser.switch_to.window(browser.window_handles[1])
    browser.get('https://www.taobao.com')
    time.sleep(1)
    browser.switch_to.window(browser.window_handles[0])
    browser.get('https://python.org')
    

    12、反屏蔽:

    现在有很多网站增加了对 Selenium 的检测,大多数情况下,检测的基本原理是检测当前浏览器窗口下的 window.navigator 对象中是否包含 webdriver 属性。 正常使用浏览器时,这个属性为 undefined,一旦使用了 Selenium,它就会给 window.navigator 对象设置 webdriver 属性。很多网站通过 JavaScript 语句判断是否存在 webdriver 属性,如果存在直接屏蔽。一个典型的案例网站:http://tjj.hubei.gov.cn/tjsj/tjgb/ndtjgb/sztjgb/,就是使用上述原理,检测是否存在 webdriver 属性,如果我们使用 Selenium 直接抓取该网站的数据,网站返回如下图所示的页面:
    在这里插入图片描述
    Selenium 中,可以用 CDP(即 Chrome Devtools Protocol, Chrome 开发工具协议) 解决这个问题,利用它可以实现在每个页面刚加载的时候就执行 JavaScript 语句,将 webdriver 属性 置空。这里执行的 CDP 方法 叫作 Page.addScriptToEvaluateOnNewDocument,将上面的 JavaScript 语句传入其中即可。另外,还可以加入几个选项来隐藏 WebDriver 提示条和自动化扩展信息,代码实现如下:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 1:53
    # @Author  : AmoXiang
    # @FileName: demo11.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    
    from selenium import webdriver
    from selenium.webdriver import ChromeOptions
    
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    option.add_experimental_option('useAutomationExtension', False)
    browser = webdriver.Chrome(options=option)
    browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
        'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
    })
    browser.get('http://tjj.hubei.gov.cn/tjsj/tjgb/ndtjgb/sztjgb/')
    

    这样就能加载整个页面了,如下图所示:
    在这里插入图片描述
    注意:在大多数时候,以上方法可以实现 Selenium 的反屏蔽。但也存在一些特殊网站会对 WebDriver 属性 设置更多的特征检测,这种情况下可能需要具体排查。

    13、无头模式:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/12/7 2:10
    # @Author  : AmoXiang
    # @FileName: demo12.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/xw1680?
    
    from selenium import webdriver
    from selenium.webdriver import ChromeOptions
    
    option = ChromeOptions()
    option.add_argument('--headless')  # 无头模式:一定程度上节省资源加载的时间和网络宽带
    browser = webdriver.Chrome(options=option)
    browser.set_window_size(1366, 768)
    browser.get('https://www.baidu.com')
    browser.get_screenshot_as_file('preview.png')
    

    至此今天的案例就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习爬虫的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


    在这里插入图片描述

        好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
        如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
     编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

    展开全文
  • Vue+ElementUI实现表单动态渲染、校验(一)项目需求1.vue表单实现递归渲染 项目需求 接到新的项目需求,需要把一个json文件动态渲染成表单,并添加各种校验规则等。经过各种查资料,最终完成了此功能开发,对这块的...

    Vue+ElementUI实现表单动态渲染、校验(一)

    项目需求

    接到新的项目需求,需要把一个json文件动态渲染成表单,并添加各种校验规则等。经过各种查资料,最终完成了此功能开发,对这块的知识点进行梳理如下。

    1.vue表单实现递归渲染

    我们需要实现的Json文件格式如下:

    // An highlighted block
     "configs": [
            {
                "name": "school1",
                "cnName": "学校一",
                "childNodes": [
                    {
                        "name": "grade1",
                        "cnName": "一年级",
                        "props": [
                            {
                                "name": "class1",
                                "cnName": "一班",
                                "dataType": "int",
                                "desc": "班级人数",
                                "validator": {
                                    "min": 20,
                                    "max": 50,
                                    "required": true
                                }
                            },
                            {
                                "name": "class2",
                                "cnName": "二班",
                                "dataType": "int",
                                "desc": "班级人数",
                                "validator": {
                                    "min": 20,
                                    "max": 50,
                                    "required": true
                                }
                            },
                            {
                                "name": "class3",
                                "cnName": "三班",
                                "dataType": "int",
                                "desc": "班级人数",
                                "validator": {
                                    "min": 20,
                                    "max": 50,
                                    "required": true
                                }
                            },
                        ]
                    }
                ]
            },
            {
                "name": "school2",
                "cnName": "学校二",
                "childNodes": [
                    {
                        "name": "grade1",
                        "cnName": "一年级",
                        "props": [
                            {
                                "name": "class1",
                                "cnName": "一班",
                                "dataType": "int",
                                "desc": "班级人数",
                                "validator": {
                                    "min": 20,
                                    "max": 50,
                                    "required": true
                                }
                            }
                        ]
                    },
                    {
                        "name": "grade2",
                        "cnName": "二年级",
                        "props": [
                            {
                                "name": "class1",
                                "cnName": "一班",
                                "dataType": "int",
                                "desc": "班级人数",
                                "validator": {
                                    "min": 20,
                                    "max": 50,
                                    "required": true
                                }
                            },
                            {
                                "name": "class2",
                                "cnName": "二班",
                                "dataType": "int",
                                "desc": "班级人数",
                                "validator": {
                                    "min": 20,
                                    "max": 50,
                                    "required": true
                                }
                            },
                        ]
                    }
                ]
            }
        ]
    

    简单列举一下,由于我们需求的JSON可能会嵌套很多层,所以必须实现递归渲染。
    index.vue
    index.vue 本身可作为递归组件使用。 configs 为Json配置文件

    <div class="form-group">
          <div v-for="(item, index) in configs" :key="index">
            <div class="titleMain">
              <span class="verticalLine"></span>{{ item.cnName }}
            </div>
            
            <!-- 判断json文件是否有childNodes,有的话,继续循环childNodes内的对象 -->
            
            <template v-if="item.childNodes">
              <div
                v-for="(itemChild, indexChild) in item.childNodes"
                :key="indexChild"
              >
              
               <!-- :configs="itemChild"  childNodes内部实现递归循环 -->
               
                <form-group
                  v-if="itemChild.childNodes"
                  :configs="itemChild"
                ></form-group>
                 <!-- 展示动态表单组件 -->
                  <div>
                    <el-form
                      ref="formgroup"
                      class="dynamic-form"
                      :model="getModel(itemChild.props, 'form' + indexChild)"
                    >
                      <dynamic-form
                        ref="dynamicForm"
                        v-for="(itemInput, indexInput) in itemChild.props"
                        :key="itemInput.name + index + indexInput"
                        :item="itemInput"
                        :childItem="itemChild"
                        :configs="configs"
                        :numberValidator="numberValidator"
                        :value="itemInput.value"
                        @input="handleInput($event, itemInput.name, itemInput)"
                      ></dynamic-form>
                    </el-form>
                  </div>
              </div>
            </template>
            <!-- 判断json文件是否有childNodes,没有的话,直接展示动态表单组件 -->
            <template v-else>
              <div>
                <div>
                  <el-form
                    ref="formgroup"
                    class="dynamic-form"
                    :model="getModel(itemChild.props, 'form2' + indexChild)"
                  >
                    <dynamic-form
                      ref="dynamicForm"
                      v-for="(itemInput, indexInput) in itemChild.props"
                      :key="itemInput.name + index + '_' + indexInput"
                      :item="itemInput"
                      :childItem="itemChild"
                      :configs="configs"
                      :numberValidator="numberValidator"
                      :value="itemInput.value"
                      @input="handleInput($event, itemInput.name, itemInput)"
                    ></dynamic-form>
                  </el-form>
                </div>
              </div>
            </template>
          </div>
        </div>
    

    此处
    在这里插入图片描述文件的name名和组件名是一致的
    在这里插入图片描述

    dynamicForm.vue
    项目中目前使用的组件都是输入框和下拉框,因此动态表单中只使用了el-input 和 el-select。此处逻辑是参照网上看到的帖子内容,并非完全自创。

     <el-form-item
        v-if="!item.hidden"
        :rules="rules"
        :label="item.cnName"
        :prop="item.name"
        class="formItem"
      >
        <el-input
          v-if="item.dataType === 'int'"
          v-bind="$attrs"
          v-on="$listeners"
          :placeholder="item.placeholder"
          @change="
            val => {
              item.valueChange
                ? item.valueChange(val, formData, clone, numberValidator)
                : valueChange()
            }
          "
          :disabled="item.disable"
          :readonly="item.readonly"
          :autosize="item.autosize"
          v-model="item.value"
        ></el-input>
        <el-input
          v-else-if="item.dataType === 'string'"
          v-bind="$attrs"
          v-on="$listeners"
          :placeholder="item.placeholder"
          :disabled="item.disable"
          :readonly="item.readonly"
          v-model="item.value"
        ></el-input>
    
        <el-select
          v-else-if="item.dataType === 'select'"
          v-bind="$attrs"
          v-on="$listeners"
          :multiple="item.multiple"
          :disabled="item.disabled"
          @change="
            val => {
              item.valueChange(val, childItem)
            }
          "
        >
          <el-option
            v-for="o in item.optionals"
            :key="o.value"
            :label="o.cnName"
            :value="o.value"
            :disabled="o.disabled"
          >
          </el-option>
        </el-select>
      </el-form-item>
    

    json中props数组中的每一个对象对应了一个输入框,通过父子组件传参,将props中的对象遍历,分别传到dynamicForm组件,组件拿到props中每个对象的属性,对应展示即可。
    在这里插入图片描述
    表单动态渲染的部分大概就是这样。

    后面针对此json文件的校验部分进行梳理。

    展开全文
  • vue 动态渲染背景图片

    2021-11-19 12:37:39
    一说到渲染背景图这里就要用到 动态的style了代码如下: 这边是渲染的本地图片所以用到了 require()来解析 不是本地的去掉及可 :style="{ 'background-image': `url(${require('../assets/' + item.url + '.png')}...

    一说到渲染背景图这里就要用到动态的style了代码如下:

    这边是渲染的本地图片所以用到了 require() 来解析 不是本地的话去掉及可
      <div
        v-for="(item, index) in list"
        :key="index"
        :style="{
            'background-image': `url(${require('../assets/' + item.url + '.png')})`,
          }"
       ></div>
    
    展开全文
  • SEO:服务端动态渲染

    2021-01-30 23:58:36
    服务端对请求的 user-agent 进行判断,浏览器端直接给 SPA 页面,如果是爬虫,给经过动态渲染的 html 页面 方案 这里又分为两个方案: 方案1:node 对请求的 user-agent 进行判断 方案2:nginx 对请求的 user-agent ...
  • 随着越来越多的网站开始用JS在客户端浏览器动态渲染网站,导致很多我们需要的数据并不能由原始的html中获取,再加上Scrapy本身并不提供JS渲染解析的功能,通常对这类网站数据的爬取我们一般采用两种方法:通过分析...
  • 根据数据和模板动态生成页面 1.根据规则去解析链接,并且获取ID或者时索引值 //请求路径:http://127.0.0.1/movies/0 let index = req.pathObj.base; 2.根据索引获取数据 let movies = [ { .
  • js动态渲染table

    2021-06-25 16:42:13
    html页面: jquery.min.js文件可以自己下载,在这不做其他叙述了 <!DOCTYPE html> <html lang="en">...link rel="stylesheet" href="resources/css/supplierTable.css">.../head&g.
  • 这篇文章主要介绍了Vue+ElementUI实现表单动态渲染、可视化配置的方法,需要的朋友可以参考下动态渲染就是有一个异步的数据,大概长这样:{"inline": true,"labelPosition": "right","labelWidth": "","size": "small...
  • swiper动态渲染数据

    2021-03-19 12:31:24
    页面渲染完再写轮播图插件,好多插件都是这样 $.ajax({ type: "GET", url: "/banner/list", success: function (res) { console.log("轮播图", res); if (res.code == 0) { for (var i = 0; i < res....
  • layui navTree 动态渲染菜单组件介绍

    千次阅读 2020-12-30 08:24:54
    navTree.js 简介extends/...extends/navTree.js 原本是作者在开源面板项目 Layui Fun CMS 中编写的一个基于 layui 的动态渲染菜单的组件,现在把这个扩展组件独立开发出来,使它不必依赖与 Layui Fun CMS 一起使...
  • 动态渲染图片数组

    2021-10-20 09:37:55
    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ...meta name="viewport" content="width=device-width, initial-scale=1.0">...titl...
  • vue 动态渲染style

    2021-02-01 17:42:56
    :style="getMembertemporaryStatus(status)" 方法: getMembertemporaryStatus(status) { if (status) { return 'background:#f5ccff' } return '' }, 第二种: 文章:... .
  • 背景前段时间写了一个自动化安装 MySQL 的程序,其中有一个环节就是动态渲染 my.cnf 文件;总的解决方案就是像 Django 渲染 html 页面一样,用渲染模板的方式来解决。[mysqld]basedir = {{basedir}}datadir = {{...
  • 通过在vue中使用element的table表格,实现数据动态渲染,并且动态渲染表头。通过在父组件中引入子组件表格,然后向子组件传递表格数据和表头数据。子组件table中template模板:data="this.tableData"height="400px...
  • 以上所述是小编给大家介绍的VUE Element-UI多级菜单动态渲染的组件详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
  • 我就废话不多说了,大家看代码吧~ {{msg}} {{msg}} {{msg}} 补充... 以上这篇vue内置组件component--通过is属性动态渲染组件操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
  • ElementUI table表格列动态渲染

    千次阅读 2021-04-28 06:18:15
    根据api返回的数据,进行动态渲染。 官方table示例,链接如下: https://element.eleme.cn/#/zh-CN/component/table 二、实现 在此基础上,增加tableHeader 变量,用来动态渲染。 test.vue <template> <...
  • vue根据接口返回 动态渲染组件的实现方法 使用了vue中的动态组件 https://cn.vuejs.org/v2/guide/components.html#%E5%8A%A8%E6%80%81%E7%BB%84%E4%BB%B6 父容器 <template> <template v-for="item in ...
  • 改text标签为span <span class="iconfont" v-html="item.icon"></span>
  • layui——动态渲染下拉框

    千次阅读 2021-02-06 23:33:37
    需求动态的给下拉框赋值,且仍具有layui的样式实现html代码,保留一个请选择(可去除,默认下拉会选择第一个)最重要的是这个class属性layui-form,很多人是因为没有添加这个属性导致layui.form.render()重新渲染无效...
  • 动态渲染表格
  • 本文实例为大家分享了vue+iview 动态渲染表格(iview插件table),供大家参考,具体内容如下效果图(表格头部和表格主体都是动态渲染)重要代码export default {data () {return {entities: []}},mounted () {// 进行...
  • file1、添加依赖org.thymeleafthymeleaf3.0.9.RELEASE2、编码工具类 HTMLTemplateUtils.javaimport org.thymeleaf.TemplateEngine;import org.thymeleaf.context.Context;.../*** HTML模板渲染工具类*/public class ...
  • Layui select 下拉框动态渲染这几天在做一个功能时需要用到 select 动态渲染。但是我在渲染的时候始终不对,第一次始终不能渲染,而且随着 select 个数增多渲染次数也要增加,然后回来剥离一个 demo 结果又可以,白...
  • 在使用Vue框架和element-ui开发时,下拉框遇见一个问题,其选项是动态渲染的,页面选择时某一选项后,在函数中查看是修改成功了,但在页面中没有及时刷新改变后的值,也就是下拉框值无法选中。 出现原因: 出现这个...
  • 直接拼接,然后根据返回值渲染select// 动态渲染脚本类型下拉框// 1.发送ajax请求得到data// 2.将data渲染到页面上function getDataList() {// 请求$.ajax({type:'post',url: "/cd/workPlatform/tool/detail",...
  • Vue动态渲染本地图片

    2021-01-14 15:58:56
    今天总结一下Vue动态渲染本地图片的一些问题~ 如果你直接使用本地图片地址,像下面这样 <div> <img src="../../images/icon_01.png"> </div> 这是可以正常显示图片的, 但是如果你想遍历...
  • vue中动态渲染css样式

    2021-08-26 10:33:41
    vue2的,动态样式只能通过computed实现 <view :style="colors"> <view class="text"> test css </view> </view> //js data(){ return { color:'#84a555' } }, computed:{ colors...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 208,186
精华内容 83,274
关键字:

动态渲染

友情链接: MK趋势检验.zip