gpt4 book ai didi

javascript - 使用 kefirjs 将数据传递给 React 组件

转载 作者:行者123 更新时间:2023-11-29 21:42:42 26 4
gpt4 key购买 nike

我是 ReactJS 和“响应式编程”的新手。我尝试根据 this 创建调度程序、操作和存储项目,但我不知道如何将数据传递给组件。

this例如它不起作用。

var data = [1, 2, 3, 4, 5];

var AppDispatcher = Kefir.emitter();

function DataActions() {
this.getAllData = function () {
AppDispatcher.emit({
actionType: "GET_ALL"
});
};
}

var Actions = new DataActions();

var getAllDataActionsStream = AppDispatcher.filter(function (action) {
return action.actionType === "GET_ALL";
}).map(function (action) {
return function (data) {
return data;
};
});

var dataStream = Kefir.merge([getAllDataActionsStream]).scan(function (prevData, modificationFunc) {
return modificationFunc(prevData);
}, {});

var Content = React.createClass({
getInitialState: function() {
this.onDataChange = this.onDataChange.bind(this);
return {componentData: []};
},
componentDidMount: function() {
dataStream.onValue(this.onDataChange);
},
componentWillMount: function(){
dataStream.offValue(this.onDataChange);
console.log(Actions.getAllData());
},
onDataChange(newData) {
this.setState({componentData: newData});
},
render: function() {
console.log(this.state);
var list = this.state.componentData.map(function (item, i) {
return (
<li key={i}>{item}</li>
);
});

return <ul>{list}</ul>;
}
});

React.render(<Content />, document.getElementById('container'));

最佳答案

在我开始详细回答之前,我想先回答这部分:

but I don't know how to pass data to component.

在您使用 React 的 props 将 Todos 中的作者传递链接到主组件的示例中, 不带 Action 。这也是我在示例中采用的方法。

Now here is my example. I highly reccommend looking at the example and reading along to what I've written below.

var data = [ 1, 2, 3, 4, 5 ];

// This will now log all events of the AppDispatcher in the console with the prefix 'Kefer: '
var AppDispatcher = Kefir.emitter().log("Kefir: ");

function DataActions() {

// Our application has an action of emitting a random number.
this.emitNumber = function() {
AppDispatcher.emit({
actionType: "EMIT_NUMBER"
})
};
}

var Actions = new DataActions();

var emitNumberActionStream = AppDispatcher
.filter(function(action) {
return action.actionType === "EMIT_NUMBER";
})
.map(function(action) {
console.log("EMIT_NUMBER ACTION OCCURRED!!");
return Math.floor(Math.random() * (10)) + 1;
});

// Only one stream, no need to merge right now.
//var dataStream = Kefir.merge([ getAllDataActionsStream ]);


var Content = React.createClass({
getInitialState: function() {

// Set initial componentData using the data passed into this component's via props
return { componentData: this.props.data };
},
componentDidMount: function() {

// On each emitted value run the this.onDataChange function
emitNumberActionStream.onValue(this.onDataChange);

// Every second emit a number using the Actions we created earlier
setInterval(function() {
Actions.emitNumber();
}, 1000);
},
onDataChange: function(emittedNumber) {

console.log('state on change:', this.state);

// Update the state by appending the emitted number to the current state's componentData
this.setState({ componentData: this.state.componentData.concat([emittedNumber])});
console.log('updated state: ', this.state);
console.log('-----------------');
},
render: function() {
console.log('RENDER AGAIN!');

var list = this.state.componentData.map(function(item, i) {
return (
<li key={i}>{item}</li>
);
});

return <ul>{list}</ul>;
}
})
;

// Pass in initial data using props 'data={data}'
React.render(<Content data={data}/>, document.getElementById('container'));

我修改了您给出的不起作用的示例,使其起作用并且更有意义(希望如此)。

Actions 和 Stores 是这样工作的:

Action :

  • 请求发出一个数字

商店

  • 监听“EMIT_NUMBER”个 Action 并发出一个随机数

实际的组件是这样运行的:

  1. 它获取通过 props 传递给组件的前 5 个数字。
  2. 一旦安装,它就会开始监听存储并创建一个调用 Action 调度程序的 emitNumber() Action 的 setInterval。间隔是为了显示工作中的 react 性,您可以想象有一个按钮可以按下,它会改为调用 emitNumber()。
  3. 商店观察 Action 调度程序发出“EMIT_NUMBER”并发出一个数字。
  4. 组件观察商店发出的数字并更新组件的状态。
  5. 组件观察到其状态已更改并重新呈现。

关于javascript - 使用 kefirjs 将数据传递给 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32207413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com