为了账号安全,请及时绑定邮箱和手机立即绑定

渲染函数内的模板无法解析 - LitElement

渲染函数内的模板无法解析 - LitElement

喵喵时光机 2022-10-21 14:40:36
我试图通过 ajax 调用获取列表,但在它被解析之前,render()正在调用方法并且依赖于 Promise 的模板片段无法解析并抛出未定义。问题:在我从 Promise 中获取数据之前,如何显示加载器?import {    LitElement,    html} from 'lit-element';class EmpComponent extends LitElement {    constructor() {        super();        this.data = this.getEmpData();    }    getEmpData() {        fetch('../../../emp-data.json')            .then(                function(response) {                    if (response.status !== 200) {                        console.log('Looks like there was a problem. Status Code: ' +                            response.status);                        return;                    }                    response.json().then(data => data);                }            )            .catch(function(err) {                console.log('Fetch Error :-S', err);            });    }    render() {        <div>            ${this.data.map(emp => emp.active ? this.dataTemplate(emp) : '')}         </div>    }}customElements.define('emp-component', EmpComponent);收到此错误:
查看完整描述

3 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

第 1 步:创建一个js返回true或的文件false(例如 util.js)


export function when(expression, truVal, falseVal) {

    if (expression) {

        return truVal();

    }

    if (falseVal) {

        return falseVal();

    }

    return undefined;

}


第 2 步:js在您的文件中导入 util


import {

    LitElement,

    html

} from 'lit-element';

import {

    when

} from 'util.js'


第 3 步:在isLoading. static get properties所以在初始加载时,我们设置onload为 trueconstructor


import {

    LitElement,

    html

} from 'lit-element';

import {

    when

} from 'util.js'


class EmpComponent extends LitElement {

    static get properties() {

        return {

            isLoading: {

                type: Boolean

            },


        }

    }

    constructor() {

        super();

        this.isLoading = true;

    }


第 4 步:一旦获取数据,我们就可以渲染 DOM。然后我们可以设置isLoading为 false 然后使用渲染 DOMwhen


static get properties() {

    return {

        isLoading: {

            type: Boolean

        },

        canRender: {

            type: Boolean

        }

    }

}

constructor() {

    super();

    this.isLoading = true;

    this.canRender = false;

    this.data = this.getEmpData();

    this.isLoading = false;

    this.canRender = true;

}


render() {

    return html `

    ${when(this.isLoading,() => html`<p>Loading...</p>`)}

    ${when(this.canRender,() => html`<your-component></your-component>`)}

  `

}

这是until. 你可以从这个博客sabarinath blog获得更多细节


查看完整回答
反对 回复 2022-10-21
?
米脂

TA贡献1836条经验 获得超3个赞

解决方案

我评论了您应该进行更改的部分。你不需要对其他进口做奇怪的事情


import { LitElement, html } from 'lit-element';

    

class EmpComponent extends LitElement

{

    constructor() {

        super();

        // you were returning a promise to an Array type...

        // this.data = this.getEmpData();

        // Correct

        this.data = [];

        this.getEmpData();

    }


    // ADD PROPS

    static get properties() {

        return {

            data: {type:Array}

        };

    }


    getEmpData() {

        fetch('../../../emp-data.json')

            .then(()=>(response) {

                    if (response.status !== 200) {

                        console.log('Looks like there was a problem. Status Code: ' +

                            response.status);

                        return;

                    }

                    // SET DATA ON RESOLVE

                    response.json().then(data => this.data = data);

                }

            )

            .catch(function(err) {

                console.log('Fetch Error :-S', err);

            });

    }


    render() {

        <div>

            $ {

                (this.data || []).map(emp => emp.active ? this.dataTemplate(emp) : '')

            } 

        </div>

    }

}


customElements.define('emp-component', EmpComponent);


查看完整回答
反对 回复 2022-10-21
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您没有返回任何内容getEmpData()so this.datais undefined,因此出现错误。


请记住,如果您在调用return之前添加一个语句,那么将包含一个. 在这种情况下,该指令可以提供帮助:fetch()this.dataPromiseuntil


import {until} from 'lit-html/directives/until.js';


// ...


render() {

  return html`

    <div>

      ${until(

        this.data.then(data => data.map(emp => emp.active ? this.dataTemplate(emp) : ''),

        html`<p>Loading...</p>`,

      )} 

    </div>

  `;

}


查看完整回答
反对 回复 2022-10-21
  • 3 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号