GVKun编程网logo

JavaScript – React / Flux方法来处理具有登录流的权限敏感操作(react登录权限控制)

19

对于想了解JavaScript–React/Flux方法来处理具有登录流的权限敏感操作的读者,本文将提供新的信息,我们将详细介绍react登录权限控制,并且为您提供关于Flash(ActionScri

对于想了解JavaScript – React / Flux方法来处理具有登录流的权限敏感操作的读者,本文将提供新的信息,我们将详细介绍react登录权限控制,并且为您提供关于Flash(ActionScript,AS) & JavaScript通信浅谈、javascript forEach通用循环遍历方法_javascript技巧、javascript – Flux和React JS中的相关操作、javascript – React / Redux:登录后重定向的有价值信息。

本文目录一览:

JavaScript – React / Flux方法来处理具有登录流的权限敏感操作(react登录权限控制)

JavaScript – React / Flux方法来处理具有登录流的权限敏感操作(react登录权限控制)

我一直在玩React / Flux,而且我的头脑围绕着“Flux Way”卷入了处理权限敏感的行为.

总体问题:
当一个未登录的访问者尝试一个需要他/她登录的动作时,Flux的方法是(a)检查用户是否登录,(b)启动登录流程,(c)完成成功的行动

举一个论坛应用程序的例子,要求用户登录后发布:

我们有一个注释表单组件(大部分来自FB的React tut):

var CommentForm = React.createClass({
  handleSubmit: function ( e ) {
    e.preventDefault();

    // get data
    commentData = {
      content: this.refs.content.getDOMNode().value.trim()
    };

    this.props.onCommentSubmit( commentData );
    this.resetForm();
  },resetForm: function () {
    this.refs.content.getDOMNode().value = '';
  },render: function () {
    return (
      <form className="comment-form" id="comment-form" onSubmit={ this.handleSubmit }>
        <textarea name="comment[content]" placeholder="What's on your mind?" ref="content"></textarea>
        <button className="post-comment button" type="submit">Post</button>  
      </form>
    )
  }
});

评论店(缩写)

var CHANGE_EVENT = 'change';
var _comments = {};

function createComment ( data ) {
  // post to server
}

var CommentStore = React.addons.update(EventEmitter.prototype,{$merge: {

  // omitted methods

  dispatcherIndex: Appdispatcher.register(function(payload) {
    var action = payload.action;
    var text;

    switch(action.actionType) {
      case CommentConstants.ADD_COMMENT:
        Appdispatcher.waitFor([SessionStore.dispatchToken])
        createComment(action.data);
        break;
    }

    return true;
  })
}});

和一个处理会议的商店(也简称):

var CHANGE_EVENT = 'change';

function ensureCurrentUser () {
  if ( !SessionStore.currentUser() ) {
    app.router.navigate('/login');
  }
}

var SessionStore = React.addons.update(EventEmitter.prototype,{$merge: {

  // omitted code

  currentUser: function () {
    return app.context.current_user;
  },dispatchToken: Appdispatcher.register(function ( payload ) {
    var action = payload.action;

    switch(action.actionType) {
      case CommentConstants.ADD_COMMENT:
        ensureCurrentUser();
        break;
    }

    return true;
  })
}});

我最初的想法是,这是Flux的waitFor()方法的一个例子.然而,上面的实现失败,因为wait只要设置了SessionStore.dispatchToken(只要ensureCurrentUser返回)就关闭依赖循环.

这样的情况下,有效载荷应该传递到ensureCurrentUser,然后进入/ login的路由处理程序?流量处理这些流量的方法是什么?

提前致谢 :)

解决方法

正如FakeRainBrigand在他的答案中建议的那样,您只需检查用户在创建注释之前是否有一个有效的会话,首先从SessionStore中检索该值:
case CommentConstants.ADD_COMMENT:
  if (SessionStore.getUser()) {
   createComment(action.data);
  }
  break;

但是要保留注释,以便在用户登录后创建注释,我将在CommentStore中创建一个未决注释的集合,然后在回调登录验证和会话创建过程中,发出新的操作以通知用户现在已经登录的CommentStore.然后,CommentStore可以通过在挂起的时候创建真实的注释来做出回应.

Flash(ActionScript,AS) & JavaScript通信浅谈

Flash(ActionScript,AS) & JavaScript通信浅谈

摘要:本文主要阐述两个问题:①如何进行Flash编程;②Flash(.swf)如何与JavaScript通信?这里牵涉到一门语言——ActionScript。关于它,百科上是这么说的,ActionScript(简称AS)是由Macromedia(现已被Adobe收购)为其Flash产品开发的 ,最初是一种简单的脚本语言,现在最新版本ActionScript3.0,是一种完全的面向对象的编程语言,功能强大,类库丰富,语法类似JavaScript,多用于Flash互动性、娱乐性、实用性开发,网页制作和RIA(丰富互联网程序)开发。


目录:

-------------------------------------------

- 工欲善其事必先利其器

- ActionScript与JavaScript函数绑定

    - ExternalInterface.addCallback(Js调用As)

    - ExternalInterface.call(As调用Js)


1.工欲善其事必先利其器

ActionScript或者说是Flash是使用什么编程工具呢?也可以直观的说.swf文件,是如何生成的?需要明白两点:①平时用户安装的“Adobe Flash Player for IE”,其实是一个播放网页Flash的插件。按道理来说Flash应该也是遵循NPAPI协议开发的(早期插件开发协议,先已经逐渐被PPAPI替代)。②Flash CSX系列开发工具,Flash Builder等等,这些很大,功能很强,可以进行全面的Flash动画开发。


但是,本文只牵涉到网络通信方面的,不涉及任何动画开发内容。推荐一款轻量级工具:FlashDevelop+Flex SDK,这是一款很好的swf开发工具。


环境配置十分之简单,①从网上搜索FlashDevelop下载、安装 ---> ②从AppMan中选择Flex SDK(OLD)安装(如下图)。整个过程个人感觉和AndroidStudio差不多,这里需要注意的是,默认路径是../AppData/Local/FlashDevelop/Apps,可以自行在菜单栏Tools中进行修改,一般直接使用即可,不要进行修改。


OK,让我们新建一个AS3.0项目,开始Flash开发之旅。



2.ActionScript与JavaScript函数绑定

Flash与JavaScript如何通信?这是本文的核心。涉及到一个绑定机制,先放个烟雾弹...  看完以下两个函数再继续拆除烟雾弹。

(注意,以下这两个方法都是写在.as中,非js)

//①

ExternalInterface.addCallback("send",send);

//②

ExternalInterface.call("onMessage",e.data);

你很聪明,可能根本不需要再看下文了,已经明白了其中的奥妙。


2.1 ExternalInterface.addCallback(Js调用As)

ExternalInterface.addCallback:有两个参数,第一个参数“send”——指定的是JavaScript函数名;第二个参数send——指定的是AS中的函数名(AS中必须有该函数的实现体,如下)。

///发送数据
public function send(sendMsg:String = null):void{
          if (g_tcp_xml_socket.connected){
                g_tcp_xml_socket.send(sendMsg);
          }
}

如此一来,在JavaScript中就可以来一波这样的操作了...

var swf = swfobject.getobjectById(''XXXFlash'');//swf的名称

///发送消息
function send(data){
try{
swf.send(data);
}
catch(exception){
alert(''send socket error.'');
}
}


回顾一下,也算是对上文的总结:首先JavaScript加载swf文件(获得swf对象);接着JavaScript通过swf对象,再调用send方法;而"send"方法在AS中已经被绑定到send方法上了,这样就会执行AS中的send方法。至此,一套完整的JavaScript调用ActionScript方法的流程就跑通了。


2.2 ExternalInterface.call(As调用Js)

来而不往非礼也,ActionScript如何调用JavaScript呢?也是一个绑定过程 ExternalInterface.call("onMessage",e.data); 这里的onMessage是一个JavaScript中的函数名,

///消息体
function onMessage(data){

}

仅一条语句,就实现了As调用Js方法。同时,也可以注意到,ExternalInterface.call 方式还完美的实现了,参数的传递。

文中尚未对swf到底如何加载进行阐明?后续的文章中将对其说明............


@qingdujun

2017-8-23 于湖南邵阳

javascript forEach通用循环遍历方法_javascript技巧

javascript forEach通用循环遍历方法_javascript技巧

复制代码 代码如下:

var forEach = (function(){
//数组与伪数组的遍历
var _Array_forEach = function (array, block, context) {
if (array == null) return;
//对String进行特殊处理
if(typeof array == ''string''){
array = array.split('''');
}
var i = 0,length = array.length;
for (;i };
//对象的遍历
var _Function_forEach = function (object, block, context) {
for (var key in object) {
//只遍历本地属性
if (object.hasOwnProperty(key)&&block.call(context, object[key], key, object)===false){
break;
}
}
};
return function(object, block, context){
if (object == null) return;
if (typeof object.length == "number") {
_Array_forEach(object, block, context);
}else{
_Function_forEach(object, block, context);
}
};
})()

函数本身并不复杂,但很精巧。加了一些简单的注释,想信大家能看懂。
来看一点例子
复制代码 代码如下:

//1:1 \n 2:2
forEach([1,2,3,4,5],function(el,index){
if(index>2){
return false;
}
alert(index+":"+el);
});
function print(el,index){
alert(index+":"+el);
}
//a:a \n b:b \n c:c
forEach({a:''a'',b:''b'',c:''c''},print);
//1:笨 \n 2:蛋 \n 3:的 \n 4:座 \n 5:右 \n 6:铭
forEach("笨蛋的座右铭",print);
function Person(name, age) {
this.name = name || "";
this.age = age || 0;
};
Person.prototype = new Person;
var fred = new Person("jxl", 22);
fred.language = "chinese";//极晚绑定
//name:jxl \n age:22 \n language:chinese
forEach(fred,print);

注:回调函数中的index参数下标从1开始
为什么不用内置的forEach
和getElementsByClassName一样,内置的forEach效率很高,但是在功能上有局限性,它无法在循环中途退出。而在我们这个forEach中,它可以在处理函数内通过返回false的方式退出循环,更加的灵活。
特别的length属性
length属性是一个很特别的属性,看到数组,大家一定会想到length,那看到带有length属性的对象呢?那大家一定要想到伪数组(类数组)。那什么是伪数组呢?简单的理解就是能通过Array.prototype.slice转换为真正的数组的带有length属性的对象。javascript最为著名的伪数组就是arguments对象。关于伪数组有很多东西,以后我会专门写一篇博文讲这个东西。大家只要记住:不要随便给对象赋予length属性,除非你明确的知道,你准备把它当作伪数组来使用。
我想这个函数是一个简单javascript工具库中的必备函数,它是金字塔的根基,在它的基础上,进行再封装,可以让你的库更强大,更加美丽!

javascript – Flux和React JS中的相关操作

javascript – Flux和React JS中的相关操作

我目前在我们的Flux应用程序中遇到问题,其中组件需要首先获取当前用户,并且当且仅当获取当前用户时,使用不同的Ajax调用获取该用户的通知,如下所示:

_onCurrentUserChange: function() {
  this.setState(getStateFromStores());
  NotificationsActionCreator.getNotifications();
},

正如您所看到的,在我们知道currentUser已更改之后,我正在尝试将操作分派给getNotifications.

但是,Flux不允许多次分派操作,我们已决定应通过操作调度所有服务器请求.

因此,我无法等待接收currentUser,然后调度操作以获取通知.

什么是正确的Flux方法呢?

解决方法

所以我想我会发布我修复此内容的方式供其他人查看.

基本上,我们最终在WebApiUtils模块中创建了一个函数,该函数对getCurrentUser和getNotificationsForCurrentUser后端路由进行顺序Ajax调用.然后,我们调度包含currentUser和通知的操作. currentUser和notification存储都监听此事件,并且每个事件都会获取所需的数据.

如果您想查看此代码,请查看:
https://github.com/krazemon/repcoin/blob/master/js/api.js#L16
https://github.com/krazemon/repcoin/blob/master/js/stores/AuthStore.js#L59
https://github.com/krazemon/repcoin/blob/master/js/stores/NotificationsStore.js#L59-L62

我选择这个解决方案是因为它不违反我们商店的同步属性,并允许我们避免级联调度.

javascript – React / Redux:登录后重定向

javascript – React / Redux:登录后重定向

我是新的反应/ redux.I有一个Redux动作进行身份验证,之后我需要重定向到一个确认页面回家.我不知道如何重定向

这是我的index.js

import React,{ PropTypes } from 'react';
import { connect } from 'react-redux';
import { FormattedMessage } from 'react-intl';
import { createStructuredSelector } from 'reselect';
import {loginAction} from './actions';


export class Login extends React.PureComponent { // eslint-disable-line react/prefer-stateless-function

constructor(props) {
super(props);
this.state = {
  username: '',password: ''
};

// this.handleChange = this.handleChangeUsername.bind(this);
// this.handleSubmit = this.handleChangePassword.bind(this);
}

handleChangeUsername(event) {
 console.log(event.target.value);
 this.setState({username: event.target.value});
 console.log(this.state.username)
}
handleChangePassword(event) {
 this.setState({password: event.target.value});
 console.log(this.state.password)
}

 handleSubmit(event) {

this.props.dispatch(loginAction(this.state));
event.preventDefault();
}
render() {
return (
  <div>

  <div className="loginColumns animated fadeInDown">
    <div className="row">

        <div className="col-md-6">

        </div>
        <div className="col-md-6">
            <div className="iBox-content">
                <form className="m-t" role="form" onSubmit={this.handleSubmit.bind(this)}>
                    <div className="form-group">
                        <input type="email" value={this.state.username} onChange={this.handleChangeUsername.bind(this)} className="form-control" placeholder="Username" required="" />
                    </div>
                    <div className="form-group">
                        <input type="password" value={this.state.password} onChange={this.handleChangePassword.bind(this)} className="form-control" placeholder="Password" required="" />
                    </div>
                    <button type="submit" className="btn btn-primary block full-width m-b">Login</button>

                    <a href="#">
                        <small>Forgot password?</small>
                    </a>
                </form>
            </div>
        </div>
    </div>
    <hr/>
    <div className="row">
        <div className="col-md-6">
            copyright Example Company
        </div>
        <div className="col-md-6 text-right">
           <small>© 2014-2015</small>
        </div>
    </div>
</div>

  </div>
);
}
}

Login.propTypes = {
 dispatch: PropTypes.func.isrequired,};

const mapStatetoProps = createStructuredSelector({
 // Login: makeSelectLogin(),});

function mapdispatchToProps(dispatch) {
 return {
 dispatch,};
}

 export default connect(mapStatetoProps,mapdispatchToProps)(Login);

action.js

import {
  DEFAULT_ACTION,LOGIN_ACTION
} from './constants';

export function defaultAction() {
 return {
   type: DEFAULT_ACTION,};
}

export function loginAction(json) {
  return {
    type: LOGIN_ACTION,json
  };
}

reducer.js

import { fromJS } from 'immutable';
import {
  DEFAULT_ACTION,LOGIN_ACTION
} from './constants';

const initialState = fromJS({
    status: false
});

function loginReducer(state = initialState,action) {
    console.log("action",action)
  switch (action.type) {
    case DEFAULT_ACTION:
      return state;

    case LOGIN_ACTION: 
        return _testFunction(state,action.json);
        default:
      return state;
  }
}

function _testFunction(state,json) {
    if(json.username == "abcd@gmail.com" && json.password == "1234")
    return state.set("status",true)
}

export default loginReducer;

我想在成功登录后重定向/ home.我该如何重定向?

解决方法

那么,你要做的就是这样.将回调传递给您的操作.一旦操作完成它的工作,只需调用该回调,它将以编程方式将您重定向到您需要的URL.提交登录表单后,将带有回调函数的输入值传递给您的操作.

onSubmit(values) {
    this.props.loginAction(values,() => {
      this.props.history.push('/');
    });
  }

然后在您的操作中,如果您正在调用后端API,则在解析promise时,请确保调用传递给此类操作的回调函数.

export function loginAction(values,callback) {
  const request = axios.post(`/endpoint`,values)
    .then(() => callback());

  return {
    type: LOGIN,payload: request
  };
}

这就是你所要做的.您可以根据自己的情况和设置对此进行细微更改.我会把它作为练习保留给你.希望这可以帮助.快乐的编码!

今天关于JavaScript – React / Flux方法来处理具有登录流的权限敏感操作react登录权限控制的介绍到此结束,谢谢您的阅读,有关Flash(ActionScript,AS) & JavaScript通信浅谈、javascript forEach通用循环遍历方法_javascript技巧、javascript – Flux和React JS中的相关操作、javascript – React / Redux:登录后重定向等更多相关知识的信息可以在本站进行查询。

本文标签:

上一篇javascript – 使用AWS SDK for Node.js将项目放在DynamoDB表上(aws 部署web应用)

下一篇javascript – 追踪在哪里发起警报?(跟踪js代码)