【发布时间】:2020-08-31 10:50:44
【问题描述】:
如果我创建一个类
class Foo {
constructor(bar) {
this.bar = bar;
}
}
let foo = new Foo('baz');
console.log(foo.bar); // baz
我可以毫无问题地访问.bar 属性。但是,我将以下代码拆分为两个 React 组件(为清楚起见进行了修剪):
一个Card 组件
class Card extends React.Component {
constructor(props) {
super(props);
this.name = props.cardData.name;
this.image = props.cardData.image_uris.png;
}
}
一个Search 组件
class Search extends React.Component {
constructor(props) {
super(props);
this.fuse = null;
this.state = {
show: false,
query: null,
pool: [
<Card cardData={{ name: 'test', image_uris: { png: 'https://i.imgur.com/or94i38.jpg' } }}></Card >,
<Card cardData={{ name: 'test', image_uris: { png: 'https://i.imgur.com/or94i38.jpg' } }}></Card >,
<Card cardData={{ name: 'test', image_uris: { png: 'https://i.imgur.com/or94i38.jpg' } }}></Card >,
<Card cardData={{ name: 'test', image_uris: { png: 'https://i.imgur.com/or94i38.jpg' } }}></Card >,
],
results: null
}
this.getResults = this.getResults.bind(this);
}
componentDidMount() {
this.fuse = new Fuse(this.state.pool, {
keys: ['name']
})
for (let x of this.state.pool) {
console.log(x.name); // undefined!
}
}
我无法访问我之前在Card 组件上定义的属性,但我不知道为什么。我尝试创建 getter 并将属性移到构造函数之外,但无济于事。我确定我在一般的 React 或 JS 中缺少一些简单的东西,但是什么?
【问题讨论】:
-
JSX 语法 (
<Foo ... />) 创建一个 React 元素。 React 元素实际上不是类的实例,它是如何实例化类的描述符。您可以通过 refs: reactjs.org/docs/refs-and-the-dom.html 访问实际实例(以及它的属性)。话虽如此,可能有更好的方法来实现你想要的。你需要这些属性做什么? -
@FelixKling 这很有意义!用于此目的的裁判严格来说是不好的做法吗?我正在努力想一种方法来实现这个功能,否则......谢谢
-
@FelixKling 我正在尝试实现一个搜索组件,该组件可以搜索几个不同的卡片数组。我有一个
Player组件,其中包含Cards 数组:library、exile和graveyard。这个想法是有一个通用的Search组件,它可以模糊匹配上述任何数组中的Card的名称与用户输入,然后过滤显示的Cards。如果有任何用处,完整的代码在这里:github.com/Naught0/mtg-play-test & 我必须警告你我是一个新手开发者:) -
您应该只将卡片对象 (
{name: ..., image_uris: ...}) 作为数据存储在您的状态中,对这些对象执行任何计算并仅在“最后”渲染它们。 -
好吧,与其传递
Card组件(它实际上不是对象的实例),我应该只传递数据并在之后渲染它。我想我可能明白了......
标签: javascript reactjs