【问题标题】:Vue directive - execute ajax call after url is entered bu the userVue 指令 - 在用户输入 url 后执行 ajax 调用
【发布时间】:2020-10-07 12:03:03
【问题描述】:

我有一个自定义的 vue 指令,应该在用户将 url 插入输入字段之后进行 ajax 调用。我有一个问题,我在指令中包含的fetch() 函数在输入 url 时不会被执行。

这是我的模板中的代码:

<template>
<div id="app">
 <input type="search" v-model="url">
 <iframe :v-xframe="url"></iframe>
</div>
</template>

这是我的指令文件中的代码

import Vue from 'vue';

export const xframe = {
    bind(el, binding, vnode) {
        let url = binding.value;
        if( url && url.startsWith('https://www') ) {
            fetch(`https://cors-anywhere.herokuapp.com/${url}`)
            .then( (res) => res.text() )
            .then( (data) => {
                console.log(data);
                let iframeContent = data.replace(/<head([^>]*)>/i, `<head$1>
                    <base href="${url}">
                        <script>
                        // X-Frame-Bypass navigation event handlers
                        document.addEventListener('click', e => {
                            if (frameElement && document.activeElement && document.activeElement.href) {
                                e.preventDefault()                                
                                frameElement.load(document.activeElement.href)
                            }
                        });
                        document.addEventListener('submit', e => {
                            if (frameElement && document.activeElement && document.activeElement.form && document.activeElement.form.action) {
                                e.preventDefault()
                                if (document.activeElement.form.method === 'post') {
                                    frameElement.load(document.activeElement.form.action, {method: 'post', body: new FormData(document.activeElement.form)});
                                }else{
                                    frameElement.load(document.activeElement.form.action + '?' + new URLSearchParams(new FormData(document.activeElement.form)));
                                }
                            }
                        });
                        </\script>`);
                el.srcdoc = iframeContent;
            });
        }
    }         
}

是否有任何解决方案可以在 url 可用后让 fetch 函数开始执行?

【问题讨论】:

  • 你为什么要绑定你的指令? :v-xframe="url"
  • 因为从代码中可以看到,url 是从用户插入的,带有 input 元素并且是动态的。

标签: javascript vue.js


【解决方案1】:

您使用了在指令绑定到元素时调用一次的bind(el, binding, vnode) 函数,您将为此使用update(el, binding, vnode) 函数,您可以在 vue 文档中阅读更多信息:https://vuejs.org/v2/guide/custom-directive.html#Hook-Functions

【讨论】:

  • 在更新功能中,你有没有在fetch之前使用console.log(url)来查看它的打印url?你试过 axios 吗?
  • url 将被添加到指令值中,但不会登录到控制台。我没有使用 axios,因为我不希望这个简单指令有任何依赖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多