babel-react-rmodel
Advanced tools
+6
-39
@@ -7,23 +7,6 @@ const modelAtrrName = "r-model"; | ||
| let modelStr = objExpression2Str(path.node.value.expression).split("."); | ||
| console.log(modelStr); | ||
| // 如果双向数据绑定的值不是 this.state 的属性,则不作处理 | ||
| // 这里存在一种情况就是不是this.state.name 因为有时候我们会这样简写 const {name} = this.state | ||
| // if (modelStr[0] !== "this" || modelStr[1] !== "state") return; | ||
| // 将 modelStr 从类似 ‘this.state.name.value’ 变为 ‘name.value’ 的形式 | ||
| // 如果是这种形式this.state.name ===>要改为name | ||
| // if (modelStr.length >= 3 && modelStr[0] === "this" && modelStr[1] === "state") { | ||
| // modelStr = modelStr.slice(2, modelStr.length).join("."); | ||
| // } else { | ||
| // modelStr = modelStr.join('.') | ||
| // console.log(modelStr) | ||
| // } | ||
| // 有很多种情况 | ||
| // this.state.name this.state.name.age 所以我们不做截取 | ||
| // 但是会带来一个问题{this.state.name:"vnues"} 没有这种写法 属性名不能是个字符串 | ||
| // 可以转化成这种 { [`${types.changePushAssistant}`]:"vnues"} | ||
| if (modelStr[0] === "this" && modelStr[1] === "state") { | ||
| modelStr = modelStr.join("."); | ||
| } else { | ||
| // 我们给它拼接上`this.state` | ||
| // 可能存在this.name这种字段 | ||
| modelStr[0] === "this" && | ||
@@ -35,11 +18,6 @@ (modelStr = `this.state.${modelStr | ||
| } | ||
| // 将 model 属性名改为 value | ||
| // 赋予value属性 | ||
| path.node.name.name = "value"; // 确实很重要这一步 >>>>>>>>>>>> r-model={this.state.name} --->转化成 value={this.state.name} 单单改变r-model就行 | ||
| // r-model={值} 值原来是怎么样 还是原来那样 我们不做操作的 这一步 | ||
| path.node.name.name = "value"; | ||
| const setStateCall = t.callExpression( | ||
| // 调用的方法为 ‘this.setState’ | ||
| t.memberExpression(t.thisExpression(), t.identifier("setState")), | ||
| // 调用时传入的参数为一个对象 | ||
| // key 为刚刚拿到的 modelStr,value 为 e.target.value | ||
| [t.objectExpression([objPropStr2AST(modelStr, "e.target.value", t)])] | ||
@@ -82,8 +60,3 @@ ); | ||
| function JSXElementVisitor(path) { | ||
| // We can use it alongside the babel parser to traverse and update nodes: | ||
| // 这个方法是更新遍历子节点 | ||
| // 这个是对属性节点做操作 | ||
| console.log(path.traverse) | ||
| console.log(path.get) | ||
| // console.log(path.xxcc) // undefined | ||
| path.traverse({ | ||
@@ -101,5 +74,3 @@ JSXAttribute: JSXAttributeVisitor | ||
| // 把 expression AST 转换为类似 “this.state.name” 这样的字符串 | ||
| function objExpression2Str(expression) { | ||
| // 递归写法 | ||
| let objStr; | ||
@@ -117,3 +88,2 @@ if (expression.name) { | ||
| break; | ||
| case "ThisExpression": | ||
| objStr = "this"; | ||
@@ -125,6 +95,5 @@ break; | ||
| } | ||
| // 把 key - value 字符串转换为 { key: value } 这样的对象 AST 节点 | ||
| // 2是转换的意思 这里的表达 | ||
| function objPropStr2AST(key, value, t) { | ||
| console.log(value) // e.target.value | ||
| console.log(value) | ||
| console.log(objValueStr2AST(value, t)) | ||
@@ -134,7 +103,5 @@ return t.objectProperty(t.templateLiteral([t.templateElement({ raw: '', cooked: '' }, true), t.templateElement({ raw: '', cooked: '' }, true)], [t.identifier(key)]), objValueStr2AST(value, t), true) | ||
| // 对类似e.target.value或者this.state.name.son.xxx转化为AST节点 -无限制 | ||
| function objValueStr2AST(objValueStr, t) { | ||
| const values = objValueStr.split("."); | ||
| if (values.length === 1) return t.identifier(values[0]); | ||
| // 递归写法 | ||
| return t.memberExpression( | ||
@@ -141,0 +108,0 @@ objValueStr2AST(values.slice(0, values.length - 1).join("."), t), |
+1
-1
| { | ||
| "name": "babel-react-rmodel", | ||
| "version": "1.0.0", | ||
| "version": "1.0.1", | ||
| "description": "react版的双向数据绑定-- r-model", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
6633
-26.46%94
-28.24%