> 웹 프론트엔드 > 프런트엔드 Q&A > 반응에서 플럭스는 무엇을 의미합니까?

반응에서 플럭스는 무엇을 의미합니까?

青灯夜游
풀어 주다: 2021-11-25 13:43:08
원래의
1785명이 탐색했습니다.

Flux는 클라이언트 측 웹 애플리케이션의 애플리케이션 아키텍처를 구축하고 단방향 데이터 흐름 형태로 공개 상태를 관리하는 데 사용되는 공개 상태 관리 솔루션입니다.

반응에서 플럭스는 무엇을 의미합니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, 반응 버전 17.0.1, Dell G3 컴퓨터.

flux란 무엇입니까

flux는 vuex in React와 유사한 공개 상태 관리 솔루션으로, 단방향 데이터 흐름관리를 활용하여 클라이언트 웹 애플리케이션을 구축하기 위해 Facebook에서 공식적으로 제공하는 애플리케이션 아키텍처입니다.

형식의 공개 상태입니다.

공식 프레임워크라기보다는 패턴에 가깝습니다. 개발자는 새로운 코드를 너무 많이 요구하지 않고도 Flux를 빠르게 시작할 수 있습니다.

cnpm i flux -S 的方式进行安装。

flux的组成

  • View:视图层

  • Action:视图发出的消息

  • Dispatcher:派发者,用来接收Action,执行回调函数

  • Store:数据层,存放状态,一旦发生改动,

반응에서 플럭스는 무엇을 의미합니까?
flux的工作流程

Flux 的最大特点,就是数据的"单向流动"。

  • 用户访问 View

  • View 发出用户的 Action

  • Dispatcher 收到 Action,要求 Store 进行相应的更新

  • Store 更新后,发出一个"change"事件

  • View 收到"change"事件后,更新页面

上面过程中,数据总是"单向流动",任何相邻的部分都不会发生数据的"双向流动"。这保证了流程的清晰。

读到这里,你可能感到一头雾水,OK,这是正常的。接下来,我会详细讲解每一步。

View(第一部分)

请打开 Demo 的首页index.jsx ,你会看到只加载了一个组件。

// index.jsx
var React = require('react');
var ReactDOM = require('react-dom');
var MyButtonController = require('./components/MyButtonController');

ReactDOM.render(
  <MyButtonController/>,
  document.querySelector(&#39;#example&#39;)
);
로그인 후 복사

上面代码中,你可能注意到了,组件的名字不是 MyButton,而是 MyButtonController。这是为什么?

这里,我采用的是 React 的 controller view 模式。"controller view"组件只用来保存状态,然后将其转发给子组件。MyButtonController的源码很简单。

// components/MyButtonController.jsx
var React = require(&#39;react&#39;);
var ButtonActions = require(&#39;../actions/ButtonActions&#39;);
var MyButton = require(&#39;./MyButton&#39;);

var MyButtonController = React.createClass({
  createNewItem: function (event) {
    ButtonActions.addNewItem(&#39;new item&#39;);
  },

  render: function() {
    return <MyButton
      onClick={this.createNewItem}
    />;
  }
});

module.exports = MyButtonController;
로그인 후 복사

上面代码中,MyButtonController将参数传给子组件MyButton。后者的源码甚至更简单。

// components/MyButton.jsx
var React = require(&#39;react&#39;);

var MyButton = function(props) {
  return <div>
    <button onClick={props.onClick}>New Item</button>
  </div>;
};

module.exports = MyButton;
로그인 후 복사

上面代码中,你可以看到MyButton是一个纯组件(即不含有任何状态),从而方便了测试和复用。这就是"controll view"模式的最大优点。

MyButton只有一个逻辑,就是一旦用户点击,就调用this.createNewItem 方法,向Dispatcher发出一个Action。

// components/MyButtonController.jsx

  // ...
  createNewItem: function (event) {
    ButtonActions.addNewItem(&#39;new item&#39;);
  }
로그인 후 복사

上面代码中,调用createNewItem方法,会触发名为addNewItem的Action。

Action

每个Action都是一个对象,包含一个actionType属性(说明动作的类型)和一些其他属性(用来传递数据)。

在这个Demo里面,ButtonActions 对象用于存放所有的Action。

// actions/ButtonActions.js
var AppDispatcher = require(&#39;../dispatcher/AppDispatcher&#39;);

var ButtonActions = {
  addNewItem: function (text) {
    AppDispatcher.dispatch({
      actionType: &#39;ADD_NEW_ITEM&#39;,
      text: text
    });
  },
};
로그인 후 복사

上面代码中,ButtonActions.addNewItem方法使用AppDispatcher,把动作ADD_NEW_ITEM派发到Store。

Dispatcher

Dispatcher 的作用是将 Action 派发到 Store、。你可以把它看作一个路由器,负责在 View 和 Store 之间,建立 Action 的正确传递路线。注意,Dispatcher 只能有一个,而且是全局的。

Facebook官方的 Dispatcher 实现输出一个类,你要写一个AppDispatcher.js,生成 Dispatcher 实例。

// dispatcher/AppDispatcher.js
var Dispatcher = require(&#39;flux&#39;).Dispatcher;
module.exports = new Dispatcher();
로그인 후 복사

AppDispatcher.register()方法用来登记各种Action的回调函数。

// dispatcher/AppDispatcher.js
var ListStore = require(&#39;../stores/ListStore&#39;);

AppDispatcher.register(function (action) {
  switch(action.actionType) {
    case &#39;ADD_NEW_ITEM&#39;:
      ListStore.addNewItemHandler(action.text);
      ListStore.emitChange();
      break;
    default:
      // no op
  }
})
로그인 후 복사

上面代码中,Dispatcher收到ADD_NEW_ITEM动作,就会执行回调函数,对ListStore进行操作。

记住,Dispatcher 只用来派发 Action,不应该有其他逻辑。

Store

Store 保存整个应用的状态。它的角色有点像 MVC 架构之中的Model 。

在我们的 Demo 中,有一个ListStore,所有数据都存放在那里。

// stores/ListStore.js
var ListStore = {
  items: [],

  getAll: function() {
    return this.items;
  },

  addNewItemHandler: function (text) {
    this.items.push(text);
  },

  emitChange: function () {
    this.emit(&#39;change&#39;);
  }
};

module.exports = ListStore;
로그인 후 복사

上面代码中,ListStore.items用来保存条目,ListStore.getAll()用来读取所有条目,ListStore.emitChange()cnpm i flux -S를 사용하여 설치하세요.

🎜Flux 구성 🎜🎜🎜
  • 🎜View: 뷰 레이어🎜
  • 🎜Action: 뷰가 보낸 메시지🎜< /li>
  • 🎜디스패처: 액션을 수신하고 콜백 함수를 실행하는 데 사용되는 디스패처🎜
  • 🎜Store: 데이터 레이어, 저장 상태, 변경 사항이 발생하면🎜
< p class="image-package" style="text-align: center;">반응에서 플럭스는 무엇을 의미합니까?
Flux의 워크플로🎜🎜Flux의 가장 큰 특징은 데이터의 '일방향 흐름'입니다. 🎜
  • 🎜사용자가 View에 액세스🎜
  • 🎜View에서 사용자의 Action이 발생함🎜
  • 🎜Dispatcher가 Action을 수신합니다. 그에 따라 스토어를 업데이트합니다🎜
  • 🎜스토어가 업데이트된 후 "변경" 이벤트를 보냅니다🎜
  • 🎜View는 "변경" 이벤트를 받은 후 페이지를 업데이트합니다🎜
🎜위 과정에서 데이터는 항상 '한 방향으로 흐르고', 인접한 부분에서는 데이터의 '양방향 흐름'이 발생하지 않습니다. 이는 프로세스의 명확성을 보장합니다. 🎜🎜이 글을 읽고 나면 혼란스러울 수도 있습니다. 그렇습니다. 이는 정상입니다. 다음으로 각 단계에 대해 자세히 설명하겠습니다. 🎜

보기(1부)

🎜데모 홈페이지 index.jsx를 열면 하나의 컴포넌트만 로드된 것을 볼 수 있습니다. 🎜
// stores/ListStore.js
var EventEmitter = require(&#39;events&#39;).EventEmitter;
var assign = require(&#39;object-assign&#39;);

var ListStore = assign({}, EventEmitter.prototype, {
  items: [],

  getAll: function () {
    return this.items;
  },

  addNewItemHandler: function (text) {
    this.items.push(text);
  },

  emitChange: function () {
    this.emit(&#39;change&#39;);
  },

  addChangeListener: function(callback) {
    this.on(&#39;change&#39;, callback);
  },

  removeChangeListener: function(callback) {
    this.removeListener(&#39;change&#39;, callback);
  }
});
로그인 후 복사
로그인 후 복사
🎜위 코드에서 구성 요소의 이름이 MyButton이 아니라 MyButtonController라는 것을 알 수 있습니다. 왜 그래? 🎜🎜여기서는 React의 컨트롤러 뷰 모드를 사용합니다. "컨트롤러 보기" 구성 요소는 상태를 저장한 다음 이를 하위 구성 요소에 전달하는 데만 사용됩니다. MyButtonController의 소스 코드는 매우 간단합니다. 🎜
// components/MyButtonController.jsx
var React = require(&#39;react&#39;);
var ListStore = require(&#39;../stores/ListStore&#39;);
var ButtonActions = require(&#39;../actions/ButtonActions&#39;);
var MyButton = require(&#39;./MyButton&#39;);

var MyButtonController = React.createClass({
  getInitialState: function () {
    return {
      items: ListStore.getAll()
    };
  },

  componentDidMount: function() {
    ListStore.addChangeListener(this._onChange);
  },

  componentWillUnmount: function() {
    ListStore.removeChangeListener(this._onChange);
  },

  _onChange: function () {
    this.setState({
      items: ListStore.getAll()
    });
  },

  createNewItem: function (event) {
    ButtonActions.addNewItem(&#39;new item&#39;);
  },

  render: function() {
    return <MyButton
      items={this.state.items}
      onClick={this.createNewItem}
    />;
  }
});
로그인 후 복사
로그인 후 복사
🎜위 코드에서 MyButtonController는 매개변수를 하위 구성 요소인 MyButton에 전달합니다. 후자의 소스 코드는 훨씬 더 간단합니다. 🎜
// components/MyButton.jsx
var React = require(&#39;react&#39;);

var MyButton = function(props) {
  var items = props.items;
  var itemHtml = items.map(function (listItem, i) {
    return <li key={i}>{listItem}</li>;
  });

  return <div>
    <ul>{itemHtml}</ul>
    <button onClick={props.onClick}>New Item</button>
  </div>;
};

module.exports = MyButton;
로그인 후 복사
로그인 후 복사
🎜위 코드에서 MyButton은 테스트와 재사용을 용이하게 하는 순수 구성 요소(즉, 상태를 포함하지 않음)임을 알 수 있습니다. 이것이 '컨트롤 뷰' 모드의 가장 큰 장점입니다. 🎜🎜MyButton에는 사용자가 this.createNewItem 메서드를 클릭하면 해당 메서드를 호출하고 Dispatcher에 작업을 보내는 로직이 하나만 있습니다. 🎜rrreee🎜위 코드에서 createNewItem 메서드를 호출하면 addNewItem이라는 작업이 트리거됩니다. 🎜

Action

🎜각 Action은 actionType 속성(액션 유형 설명)과 기타 속성(데이터 전달에 사용됨)을 포함하는 개체입니다. 🎜🎜이 데모에서는 ButtonActions 개체를 사용하여 모든 작업을 저장합니다. 🎜rrreee🎜위 코드에서 ButtonActions.addNewItem 메서드는 AppDispatcher를 사용하여 ADD_NEW_ITEM 작업을 Store에 전달합니다. 🎜

Dispatcher

🎜Dispatcher의 기능은 Action을 Store로 전달하는 것입니다. 보기와 저장 사이의 작업에 대한 올바른 전달 경로를 설정하는 역할을 담당하는 라우터로 생각할 수 있습니다. Dispatcher는 하나만 있을 수 있으며 전역적입니다. 🎜🎜 Facebook의 공식 Dispatcher 구현은 클래스를 출력합니다. Dispatcher 인스턴스를 생성하려면 AppDispatcher.js를 작성해야 합니다. 🎜rrreee🎜AppDispatcher.register() 메소드는 다양한 Action 콜백 함수를 등록하는 데 사용됩니다. 🎜rrreee🎜위 코드에서 Dispatcher는 ADD_NEW_ITEM 액션을 수신하면 콜백 함수를 실행하고 ListStore를 작동시킵니다. 🎜🎜Dispatcher는 작업을 전달하는 데만 사용되며 다른 논리를 가져서는 안 된다는 점을 기억하세요. 🎜

Store

🎜Store는 전체 애플리케이션의 상태를 저장합니다. 그 역할은 MVC 아키텍처의 모델과 약간 비슷합니다. 🎜🎜데모에는 모든 데이터가 저장되는 ListStore가 있습니다. 🎜rrreee🎜위 코드에서 ListStore.items는 항목을 저장하는 데 사용되며, ListStore.getAll()은 모든 항목을 읽는 데 사용되며, ListStore.emitChange( )< /code>는 "변경" 이벤트를 발생시키는 데 사용됩니다. 🎜🎜스토어는 변경 후 뷰에 "변경" 이벤트를 보내야 하므로 이벤트 인터페이스를 구현해야 합니다. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">// stores/ListStore.js var EventEmitter = require(&amp;#39;events&amp;#39;).EventEmitter; var assign = require(&amp;#39;object-assign&amp;#39;); var ListStore = assign({}, EventEmitter.prototype, { items: [], getAll: function () { return this.items; }, addNewItemHandler: function (text) { this.items.push(text); }, emitChange: function () { this.emit(&amp;#39;change&amp;#39;); }, addChangeListener: function(callback) { this.on(&amp;#39;change&amp;#39;, callback); }, removeChangeListener: function(callback) { this.removeListener(&amp;#39;change&amp;#39;, callback); } });</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div><p>上面代码中,<code>ListStore继承了EventEmitter.prototype,因此就能使用ListStore.on()ListStore.emit(),来监听和触发事件了。

Store 更新后(this.addNewItemHandler())发出事件(this.emitChange()),表明状态已经改变。 View 监听到这个事件,就可以查询新的状态,更新页面了。

View (第二部分)

现在,我们再回过头来修改 View ,让它监听 Store 的 change 事件。

// components/MyButtonController.jsx
var React = require(&#39;react&#39;);
var ListStore = require(&#39;../stores/ListStore&#39;);
var ButtonActions = require(&#39;../actions/ButtonActions&#39;);
var MyButton = require(&#39;./MyButton&#39;);

var MyButtonController = React.createClass({
  getInitialState: function () {
    return {
      items: ListStore.getAll()
    };
  },

  componentDidMount: function() {
    ListStore.addChangeListener(this._onChange);
  },

  componentWillUnmount: function() {
    ListStore.removeChangeListener(this._onChange);
  },

  _onChange: function () {
    this.setState({
      items: ListStore.getAll()
    });
  },

  createNewItem: function (event) {
    ButtonActions.addNewItem(&#39;new item&#39;);
  },

  render: function() {
    return <MyButton
      items={this.state.items}
      onClick={this.createNewItem}
    />;
  }
});
로그인 후 복사
로그인 후 복사

上面代码中,你可以看到当MyButtonController 发现 Store 发出 change 事件,就会调用 this._onChange 更新组件状态,从而触发重新渲染。

// components/MyButton.jsx
var React = require(&#39;react&#39;);

var MyButton = function(props) {
  var items = props.items;
  var itemHtml = items.map(function (listItem, i) {
    return <li key={i}>{listItem}</li>;
  });

  return <div>
    <ul>{itemHtml}</ul>
    <button onClick={props.onClick}>New Item</button>
  </div>;
};

module.exports = MyButton;
로그인 후 복사
로그인 후 복사

推荐学习:《react视频教程

위 내용은 반응에서 플럭스는 무엇을 의미합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿