Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在回调中访问Svelte组件属性?_Javascript_Svelte_Svelte 3 - Fatal编程技术网

Javascript 在回调中访问Svelte组件属性?

Javascript 在回调中访问Svelte组件属性?,javascript,svelte,svelte-3,Javascript,Svelte,Svelte 3,假设组件中有许多属性: a='foo'; 设b='bar'; // ... 设z='baz'; 然后,您需要从一个外部回调中更新所有这些组件,就像在另一个库中一样(即,某些组件本身不是也不可能是苗条组件) 一个简单的用例就是加载一组数据的AJAX方法(假设此AJAX函数工作,您可以向其传递回调): onMount(异步函数(){ ajax('/data',函数(data){ a=数据a; b=数据b; // ... z=data.z; }); }); 这是可行的,但这是令人难以置信的陈词滥调

假设组件中有许多属性:

a='foo';
设b='bar';
// ...
设z='baz';
然后,您需要从一个外部回调中更新所有这些组件,就像在另一个库中一样(即,某些组件本身不是也不可能是苗条组件)

一个简单的用例就是加载一组数据的AJAX方法(假设此AJAX函数工作,您可以向其传递回调):

onMount(异步函数(){
ajax('/data',函数(data){
a=数据a;
b=数据b;
// ...
z=data.z;
});
});
这是可行的,但这是令人难以置信的陈词滥调。我真正想要的是一种循环遍历所有属性的方法,这样就可以通过编程方式将它们分配给属性,特别是在事先不了解外部库/回调的情况下

是否无法访问苗条组件及其属性,以便您可以循环访问它们并从外部函数分配它们

Vue对此有一个简单的解决方案,因为您可以传递组件,但仍可以检查并指定其属性:

var vm=this;
ajax('/data',函数(data){
for(var输入数据){
if(vm.hasOwnProperty(键)){
vm[key]=数据[key];
}
});
});
我已经看到了一些解决方案,但它们都过时了——没有一个能与苗条3一起使用


如果以前有人问过,我会道歉。我花了好几天的时间试图解决这个问题,以避免所有额外的样板文件,我能找到的最接近的是现在没有答案的文件。

如果可能,您可以将ajax调用放在父组件中,并将其返回的数据存储在临时对象中,然后使用spread操作符传递到组件

<Component { ...dataObject }></Component>

let dataObject = {};
onMount(async function() {
  ajax('/data', function(data) {
    dataObject = data;
  });
});

让dataObject={};
onMount(异步函数(){
ajax('/data',函数(data){
数据对象=数据;
});
});

您可以使用分解结构来简化样板文件:

onMount(异步函数(){
ajax('/data',data=>{
({a,b,…,z}=数据);
});
});
但是,如果有大量变量,那么最好首先将它们放在对象中:

let-stuff;
onMount(异步函数(){
ajax('/data',data=>{
材料=数据;
});
});

此解决方案干净且简单,但有时您不喜欢污染父范围-但JS spread operator非常有用。我不得不重新设计我的应用程序以使其正常工作,但最终这是一个不错的解决方案,将共享代码放入父组件对我来说很有意义。正如@RafałWarzycha所提到的,我不认为它适用于任何地方,但在其他情况下,本页上的另一个答案非常适合。非常感谢。在某些情况下,将所有内容放入对象是简化的好主意,我肯定会使用它。非常感谢。无法检查组件中是否存在属性似乎是对svelte的一个相当严重的限制。