diff --git a/dist/vue-relay.common.js b/dist/vue-relay.common.js index 8b9837e..be33845 100644 --- a/dist/vue-relay.common.js +++ b/dist/vue-relay.common.js @@ -360,22 +360,24 @@ var fetchQueryAndComputeStateFromProps = function fetchQueryAndComputeStateFromP } }; +var props = { + cacheConfig: {}, + dataFrom: {}, + environment: { + required: true + }, + query: {}, + variables: { + type: Object, + default: function _default() { + return {}; + } + } +}; + var QueryRenderer = { name: 'relay-query-renderer', - props: { - cacheConfig: {}, - dataFrom: {}, - environment: { - required: true - }, - query: {}, - variables: { - type: Object, - default: function _default() { - return {}; - } - } - }, + props: props, data: function data() { var _this = this; @@ -411,33 +413,44 @@ var QueryRenderer = { } }), state: Object.freeze(_extends({ - prevPropsEnvironment: this.$props.environment, - prevPropsVariables: this.$props.variables, - prevQuery: this.$props.query, + prevPropsEnvironment: this.environment, + prevPropsVariables: this.variables, + prevQuery: this.query, queryFetcher: queryFetcher, retryCallbacks: retryCallbacks }, state)) }; }, - beforeUpdate: function beforeUpdate() { - if (this.state.prevQuery !== this.query || this.state.prevPropsEnvironment !== this.environment || !areEqual(this.state.prevPropsVariables, this.variables)) { - var state = fetchQueryAndComputeStateFromProps(this.$props, this.state.queryFetcher, this.state.retryCallbacks); - - // React getDerivedStateFromProps is static method. - // Vue beforeUpdate is instance method. - // Thus updaing relayContext here instead of in render. - this.context.relay.environment = state.relayContextEnvironment; - this.context.relay.variables = state.relayContextVariables; - this.setState(_extends({ - prevQuery: this.query, - prevPropsEnvironment: this.environment, - prevPropsVariables: this.variables - }, state)); + methods: { + setState: function setState(state) { + this.state = Object.freeze(_extends({}, this.state, state)); } }, - beforeDestroy: function beforeDestroy() { - this.state.queryFetcher.dispose(); + watch: _extends({}, Object.keys(props).map(function (key) { + return defineProperty({}, key, function () { + if (this.state.prevQuery !== this.query || this.state.prevPropsEnvironment !== this.environment || !areEqual(this.state.prevPropsVariables, this.variables)) { + var state = fetchQueryAndComputeStateFromProps(this.$props, this.state.queryFetcher, this.state.retryCallbacks); + + // React getDerivedStateFromProps is static method. + // Vue beforeUpdate is instance method. + // Thus updaing relayContext here instead of in render. + this.context.relay.environment = state.relayContextEnvironment; + this.context.relay.variables = state.relayContextVariables; + + this.setState(_extends({ + prevQuery: this.query, + prevPropsEnvironment: this.environment, + prevPropsVariables: this.variables + }, state)); + } + }); + })), + render: function render(h) { + if (process.env.NODE_ENV !== 'production') { + require('relay-runtime/lib/deepFreeze')(this.state.renderProps); + } + return h(this.component); }, created: function created() { var _this2 = this; @@ -456,17 +469,8 @@ var QueryRenderer = { } }; }, - render: function render(h) { - if (process.env.NODE_ENV !== 'production') { - require('relay-runtime/lib/deepFreeze')(this.state.renderProps); - } - return h(this.component); - }, - - methods: { - setState: function setState(state) { - this.state = Object.freeze(_extends({}, this.state, state)); - } + beforeDestroy: function beforeDestroy() { + this.state.queryFetcher.dispose(); } }; @@ -494,6 +498,11 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment return { name: 'relay-context-consumer', inject: ['relay'], + render: function render(h) { + return h(this.component, { + props: this.$attrs + }); + }, created: function created() { var relay = assertRelayContext(this.relay); var getFragmentFromTag = relay.environment.unstable_internal.getFragment; @@ -505,6 +514,12 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment this.component = { extends: createContainerWithFragments.call(this, fragments), props: Object.keys(fragments), + render: function render(h) { + if (this.context) { + return h(this.component); + } + return this.component.render(h); + }, created: function created() { var _this = this; @@ -530,19 +545,8 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment }))); } }; - }, - render: function render(h) { - if (this.context) { - return h(this.component); - } - return this.component.render(h); } }; - }, - render: function render(h) { - return h(this.component, { - props: this.$attrs - }); } }; }; @@ -583,47 +587,6 @@ var createContainerWithFragments = function createContainerWithFragments(fragmen }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - - - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$1(prevIDs, nextIDs)) { - this._release(); - - this.context.relay.environment = relay.environment; - this.context.relay.variables = relay.variables; - - var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver: resolver - }); - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props); - } - var data = this.state.resolver.resolve(); - if (data !== this.state.data) { - this.setState({ data: data }); - } - }, - beforeDestroy: function beforeDestroy() { - this._release(); - }, methods: { setState: function setState(state) { @@ -742,6 +705,49 @@ var createContainerWithFragments = function createContainerWithFragments(fragmen this.state.queryFetcher.dispose(); } } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + + + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$1(prevIDs, nextIDs)) { + this._release(); + + this.context.relay.environment = relay.environment; + this.context.relay.variables = relay.variables; + + var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver: resolver + }); + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props); + } + var data = this.state.resolver.resolve(); + if (data !== this.state.data) { + this.setState({ data: data }); + } + }); + })), + beforeDestroy: function beforeDestroy() { + this._release(); } }; }; @@ -869,47 +875,6 @@ var createContainerWithFragments$1 = function createContainerWithFragments(fragm }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - - - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$2(prevIDs, nextIDs)) { - this._release(); - - this.context.relay.environment = relay.environment; - this.context.relay.variables = relay.variables; - - var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver: resolver - }); - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props); - } - var data = this.state.resolver.resolve(); - if (data !== this.state.data) { - this.setState({ data: data }); - } - }, - beforeDestroy: function beforeDestroy() { - this._release(); - }, methods: { setState: function setState(state) { @@ -1122,6 +1087,49 @@ var createContainerWithFragments$1 = function createContainerWithFragments(fragm this.state.queryFetcher.dispose(); } } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + + + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$2(prevIDs, nextIDs)) { + this._release(); + + this.context.relay.environment = relay.environment; + this.context.relay.variables = relay.variables; + + var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver: resolver + }); + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props); + } + var data = this.state.resolver.resolve(); + if (data !== this.state.data) { + this.setState({ data: data }); + } + }); + })), + beforeDestroy: function beforeDestroy() { + this._release(); } }; }; @@ -1169,67 +1177,69 @@ var createContainerWithFragments$2 = function createContainerWithFragments(fragm }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + methods: { + setState: function setState(state) { + this.state = Object.freeze(_extends({}, this.state, state)); + }, + _handleFragmentDataUpdate: function _handleFragmentDataUpdate() { + this.setState({ + data: this.state.resolver.resolve(), + relayProp: { + isLoading: this.state.resolver.isLoading(), + environment: this.state.relayProp.environment + } + }); + } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - var resolver = this.state.resolver; + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$3(prevIDs, nextIDs)) { - resolver.dispose(); - resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + var resolver = this.state.resolver; - this.setState({ - data: resolver.resolve(), - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: { - isLoading: resolver.isLoading(), - environment: relay.environment - }, - resolver: resolver - }); - } else { - resolver.setProps(this.$props); + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$3(prevIDs, nextIDs)) { + resolver.dispose(); + resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - var data = resolver.resolve(); - if (data !== this.state.data) { this.setState({ - data: data, + data: resolver.resolve(), prevProps: this.$props, relayEnvironment: relay.environment, relayVariables: relay.variables, relayProp: { isLoading: resolver.isLoading(), environment: relay.environment - } + }, + resolver: resolver }); + } else { + resolver.setProps(this.$props); + + var data = resolver.resolve(); + if (data !== this.state.data) { + this.setState({ + data: data, + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: { + isLoading: resolver.isLoading(), + environment: relay.environment + } + }); + } } - } - }, + }); + })), beforeDestroy: function beforeDestroy() { this.state.resolver.dispose(); - }, - - methods: { - setState: function setState(state) { - this.state = Object.freeze(_extends({}, this.state, state)); - }, - _handleFragmentDataUpdate: function _handleFragmentDataUpdate() { - this.setState({ - data: this.state.resolver.resolve(), - relayProp: { - isLoading: this.state.resolver.isLoading(), - environment: this.state.relayProp.environment - } - }); - } } }; }; diff --git a/dist/vue-relay.esm.js b/dist/vue-relay.esm.js index 0e0d042..f97b8d1 100644 --- a/dist/vue-relay.esm.js +++ b/dist/vue-relay.esm.js @@ -358,22 +358,24 @@ var fetchQueryAndComputeStateFromProps = function fetchQueryAndComputeStateFromP } }; +var props = { + cacheConfig: {}, + dataFrom: {}, + environment: { + required: true + }, + query: {}, + variables: { + type: Object, + default: function _default() { + return {}; + } + } +}; + var QueryRenderer = { name: 'relay-query-renderer', - props: { - cacheConfig: {}, - dataFrom: {}, - environment: { - required: true - }, - query: {}, - variables: { - type: Object, - default: function _default() { - return {}; - } - } - }, + props: props, data: function data() { var _this = this; @@ -409,33 +411,44 @@ var QueryRenderer = { } }), state: Object.freeze(_extends({ - prevPropsEnvironment: this.$props.environment, - prevPropsVariables: this.$props.variables, - prevQuery: this.$props.query, + prevPropsEnvironment: this.environment, + prevPropsVariables: this.variables, + prevQuery: this.query, queryFetcher: queryFetcher, retryCallbacks: retryCallbacks }, state)) }; }, - beforeUpdate: function beforeUpdate() { - if (this.state.prevQuery !== this.query || this.state.prevPropsEnvironment !== this.environment || !areEqual(this.state.prevPropsVariables, this.variables)) { - var state = fetchQueryAndComputeStateFromProps(this.$props, this.state.queryFetcher, this.state.retryCallbacks); - - // React getDerivedStateFromProps is static method. - // Vue beforeUpdate is instance method. - // Thus updaing relayContext here instead of in render. - this.context.relay.environment = state.relayContextEnvironment; - this.context.relay.variables = state.relayContextVariables; - this.setState(_extends({ - prevQuery: this.query, - prevPropsEnvironment: this.environment, - prevPropsVariables: this.variables - }, state)); + methods: { + setState: function setState(state) { + this.state = Object.freeze(_extends({}, this.state, state)); } }, - beforeDestroy: function beforeDestroy() { - this.state.queryFetcher.dispose(); + watch: _extends({}, Object.keys(props).map(function (key) { + return defineProperty({}, key, function () { + if (this.state.prevQuery !== this.query || this.state.prevPropsEnvironment !== this.environment || !areEqual(this.state.prevPropsVariables, this.variables)) { + var state = fetchQueryAndComputeStateFromProps(this.$props, this.state.queryFetcher, this.state.retryCallbacks); + + // React getDerivedStateFromProps is static method. + // Vue beforeUpdate is instance method. + // Thus updaing relayContext here instead of in render. + this.context.relay.environment = state.relayContextEnvironment; + this.context.relay.variables = state.relayContextVariables; + + this.setState(_extends({ + prevQuery: this.query, + prevPropsEnvironment: this.environment, + prevPropsVariables: this.variables + }, state)); + } + }); + })), + render: function render(h) { + if (process.env.NODE_ENV !== 'production') { + require('relay-runtime/lib/deepFreeze')(this.state.renderProps); + } + return h(this.component); }, created: function created() { var _this2 = this; @@ -454,17 +467,8 @@ var QueryRenderer = { } }; }, - render: function render(h) { - if (process.env.NODE_ENV !== 'production') { - require('relay-runtime/lib/deepFreeze')(this.state.renderProps); - } - return h(this.component); - }, - - methods: { - setState: function setState(state) { - this.state = Object.freeze(_extends({}, this.state, state)); - } + beforeDestroy: function beforeDestroy() { + this.state.queryFetcher.dispose(); } }; @@ -492,6 +496,11 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment return { name: 'relay-context-consumer', inject: ['relay'], + render: function render(h) { + return h(this.component, { + props: this.$attrs + }); + }, created: function created() { var relay = assertRelayContext(this.relay); var getFragmentFromTag = relay.environment.unstable_internal.getFragment; @@ -503,6 +512,12 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment this.component = { extends: createContainerWithFragments.call(this, fragments), props: Object.keys(fragments), + render: function render(h) { + if (this.context) { + return h(this.component); + } + return this.component.render(h); + }, created: function created() { var _this = this; @@ -528,19 +543,8 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment }))); } }; - }, - render: function render(h) { - if (this.context) { - return h(this.component); - } - return this.component.render(h); } }; - }, - render: function render(h) { - return h(this.component, { - props: this.$attrs - }); } }; }; @@ -581,47 +585,6 @@ var createContainerWithFragments = function createContainerWithFragments(fragmen }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - - - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$1(prevIDs, nextIDs)) { - this._release(); - - this.context.relay.environment = relay.environment; - this.context.relay.variables = relay.variables; - - var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver: resolver - }); - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props); - } - var data = this.state.resolver.resolve(); - if (data !== this.state.data) { - this.setState({ data: data }); - } - }, - beforeDestroy: function beforeDestroy() { - this._release(); - }, methods: { setState: function setState(state) { @@ -740,6 +703,49 @@ var createContainerWithFragments = function createContainerWithFragments(fragmen this.state.queryFetcher.dispose(); } } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + + + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$1(prevIDs, nextIDs)) { + this._release(); + + this.context.relay.environment = relay.environment; + this.context.relay.variables = relay.variables; + + var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver: resolver + }); + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props); + } + var data = this.state.resolver.resolve(); + if (data !== this.state.data) { + this.setState({ data: data }); + } + }); + })), + beforeDestroy: function beforeDestroy() { + this._release(); } }; }; @@ -867,47 +873,6 @@ var createContainerWithFragments$1 = function createContainerWithFragments(fragm }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - - - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$2(prevIDs, nextIDs)) { - this._release(); - - this.context.relay.environment = relay.environment; - this.context.relay.variables = relay.variables; - - var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver: resolver - }); - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props); - } - var data = this.state.resolver.resolve(); - if (data !== this.state.data) { - this.setState({ data: data }); - } - }, - beforeDestroy: function beforeDestroy() { - this._release(); - }, methods: { setState: function setState(state) { @@ -1120,6 +1085,49 @@ var createContainerWithFragments$1 = function createContainerWithFragments(fragm this.state.queryFetcher.dispose(); } } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + + + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$2(prevIDs, nextIDs)) { + this._release(); + + this.context.relay.environment = relay.environment; + this.context.relay.variables = relay.variables; + + var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver: resolver + }); + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props); + } + var data = this.state.resolver.resolve(); + if (data !== this.state.data) { + this.setState({ data: data }); + } + }); + })), + beforeDestroy: function beforeDestroy() { + this._release(); } }; }; @@ -1167,67 +1175,69 @@ var createContainerWithFragments$2 = function createContainerWithFragments(fragm }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + methods: { + setState: function setState(state) { + this.state = Object.freeze(_extends({}, this.state, state)); + }, + _handleFragmentDataUpdate: function _handleFragmentDataUpdate() { + this.setState({ + data: this.state.resolver.resolve(), + relayProp: { + isLoading: this.state.resolver.isLoading(), + environment: this.state.relayProp.environment + } + }); + } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - var resolver = this.state.resolver; + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$3(prevIDs, nextIDs)) { - resolver.dispose(); - resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + var resolver = this.state.resolver; - this.setState({ - data: resolver.resolve(), - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: { - isLoading: resolver.isLoading(), - environment: relay.environment - }, - resolver: resolver - }); - } else { - resolver.setProps(this.$props); + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$3(prevIDs, nextIDs)) { + resolver.dispose(); + resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - var data = resolver.resolve(); - if (data !== this.state.data) { this.setState({ - data: data, + data: resolver.resolve(), prevProps: this.$props, relayEnvironment: relay.environment, relayVariables: relay.variables, relayProp: { isLoading: resolver.isLoading(), environment: relay.environment - } + }, + resolver: resolver }); + } else { + resolver.setProps(this.$props); + + var data = resolver.resolve(); + if (data !== this.state.data) { + this.setState({ + data: data, + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: { + isLoading: resolver.isLoading(), + environment: relay.environment + } + }); + } } - } - }, + }); + })), beforeDestroy: function beforeDestroy() { this.state.resolver.dispose(); - }, - - methods: { - setState: function setState(state) { - this.state = Object.freeze(_extends({}, this.state, state)); - }, - _handleFragmentDataUpdate: function _handleFragmentDataUpdate() { - this.setState({ - data: this.state.resolver.resolve(), - relayProp: { - isLoading: this.state.resolver.isLoading(), - environment: this.state.relayProp.environment - } - }); - } } }; }; diff --git a/dist/vue-relay.js b/dist/vue-relay.js index 1df0f54..d3dcf22 100644 --- a/dist/vue-relay.js +++ b/dist/vue-relay.js @@ -364,22 +364,24 @@ var fetchQueryAndComputeStateFromProps = function fetchQueryAndComputeStateFromP } }; +var props = { + cacheConfig: {}, + dataFrom: {}, + environment: { + required: true + }, + query: {}, + variables: { + type: Object, + default: function _default() { + return {}; + } + } +}; + var QueryRenderer = { name: 'relay-query-renderer', - props: { - cacheConfig: {}, - dataFrom: {}, - environment: { - required: true - }, - query: {}, - variables: { - type: Object, - default: function _default() { - return {}; - } - } - }, + props: props, data: function data() { var _this = this; @@ -415,33 +417,44 @@ var QueryRenderer = { } }), state: Object.freeze(_extends({ - prevPropsEnvironment: this.$props.environment, - prevPropsVariables: this.$props.variables, - prevQuery: this.$props.query, + prevPropsEnvironment: this.environment, + prevPropsVariables: this.variables, + prevQuery: this.query, queryFetcher: queryFetcher, retryCallbacks: retryCallbacks }, state)) }; }, - beforeUpdate: function beforeUpdate() { - if (this.state.prevQuery !== this.query || this.state.prevPropsEnvironment !== this.environment || !areEqual(this.state.prevPropsVariables, this.variables)) { - var state = fetchQueryAndComputeStateFromProps(this.$props, this.state.queryFetcher, this.state.retryCallbacks); - - // React getDerivedStateFromProps is static method. - // Vue beforeUpdate is instance method. - // Thus updaing relayContext here instead of in render. - this.context.relay.environment = state.relayContextEnvironment; - this.context.relay.variables = state.relayContextVariables; - this.setState(_extends({ - prevQuery: this.query, - prevPropsEnvironment: this.environment, - prevPropsVariables: this.variables - }, state)); + methods: { + setState: function setState(state) { + this.state = Object.freeze(_extends({}, this.state, state)); } }, - beforeDestroy: function beforeDestroy() { - this.state.queryFetcher.dispose(); + watch: _extends({}, Object.keys(props).map(function (key) { + return defineProperty({}, key, function () { + if (this.state.prevQuery !== this.query || this.state.prevPropsEnvironment !== this.environment || !areEqual(this.state.prevPropsVariables, this.variables)) { + var state = fetchQueryAndComputeStateFromProps(this.$props, this.state.queryFetcher, this.state.retryCallbacks); + + // React getDerivedStateFromProps is static method. + // Vue beforeUpdate is instance method. + // Thus updaing relayContext here instead of in render. + this.context.relay.environment = state.relayContextEnvironment; + this.context.relay.variables = state.relayContextVariables; + + this.setState(_extends({ + prevQuery: this.query, + prevPropsEnvironment: this.environment, + prevPropsVariables: this.variables + }, state)); + } + }); + })), + render: function render(h) { + { + require('relay-runtime/lib/deepFreeze')(this.state.renderProps); + } + return h(this.component); }, created: function created() { var _this2 = this; @@ -460,17 +473,8 @@ var QueryRenderer = { } }; }, - render: function render(h) { - { - require('relay-runtime/lib/deepFreeze')(this.state.renderProps); - } - return h(this.component); - }, - - methods: { - setState: function setState(state) { - this.state = Object.freeze(_extends({}, this.state, state)); - } + beforeDestroy: function beforeDestroy() { + this.state.queryFetcher.dispose(); } }; @@ -498,6 +502,11 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment return { name: 'relay-context-consumer', inject: ['relay'], + render: function render(h) { + return h(this.component, { + props: this.$attrs + }); + }, created: function created() { var relay = assertRelayContext(this.relay); var getFragmentFromTag = relay.environment.unstable_internal.getFragment; @@ -509,6 +518,12 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment this.component = { extends: createContainerWithFragments.call(this, fragments), props: Object.keys(fragments), + render: function render(h) { + if (this.context) { + return h(this.component); + } + return this.component.render(h); + }, created: function created() { var _this = this; @@ -534,19 +549,8 @@ var buildVueRelayContainer = function buildVueRelayContainer(component, fragment }))); } }; - }, - render: function render(h) { - if (this.context) { - return h(this.component); - } - return this.component.render(h); } }; - }, - render: function render(h) { - return h(this.component, { - props: this.$attrs - }); } }; }; @@ -587,47 +591,6 @@ var createContainerWithFragments = function createContainerWithFragments(fragmen }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - - - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$1(prevIDs, nextIDs)) { - this._release(); - - this.context.relay.environment = relay.environment; - this.context.relay.variables = relay.variables; - - var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver: resolver - }); - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props); - } - var data = this.state.resolver.resolve(); - if (data !== this.state.data) { - this.setState({ data: data }); - } - }, - beforeDestroy: function beforeDestroy() { - this._release(); - }, methods: { setState: function setState(state) { @@ -746,6 +709,49 @@ var createContainerWithFragments = function createContainerWithFragments(fragmen this.state.queryFetcher.dispose(); } } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + + + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$1(prevIDs, nextIDs)) { + this._release(); + + this.context.relay.environment = relay.environment; + this.context.relay.variables = relay.variables; + + var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver: resolver + }); + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props); + } + var data = this.state.resolver.resolve(); + if (data !== this.state.data) { + this.setState({ data: data }); + } + }); + })), + beforeDestroy: function beforeDestroy() { + this._release(); } }; }; @@ -873,47 +879,6 @@ var createContainerWithFragments$1 = function createContainerWithFragments(fragm }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - - - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$2(prevIDs, nextIDs)) { - this._release(); - - this.context.relay.environment = relay.environment; - this.context.relay.variables = relay.variables; - - var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver: resolver - }); - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props); - } - var data = this.state.resolver.resolve(); - if (data !== this.state.data) { - this.setState({ data: data }); - } - }, - beforeDestroy: function beforeDestroy() { - this._release(); - }, methods: { setState: function setState(state) { @@ -1126,6 +1091,49 @@ var createContainerWithFragments$1 = function createContainerWithFragments(fragm this.state.queryFetcher.dispose(); } } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + + + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$2(prevIDs, nextIDs)) { + this._release(); + + this.context.relay.environment = relay.environment; + this.context.relay.variables = relay.variables; + + var resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver: resolver + }); + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props); + } + var data = this.state.resolver.resolve(); + if (data !== this.state.data) { + this.setState({ data: data }); + } + }); + })), + beforeDestroy: function beforeDestroy() { + this._release(); } }; }; @@ -1173,67 +1181,69 @@ var createContainerWithFragments$2 = function createContainerWithFragments(fragm }) }; }, - beforeUpdate: function beforeUpdate() { - var _relay$environment$un = relay.environment.unstable_internal, - createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, - getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; + methods: { + setState: function setState(state) { + this.state = Object.freeze(_extends({}, this.state, state)); + }, + _handleFragmentDataUpdate: function _handleFragmentDataUpdate() { + this.setState({ + data: this.state.resolver.resolve(), + relayProp: { + isLoading: this.state.resolver.isLoading(), + environment: this.state.relayProp.environment + } + }); + } + }, + watch: _extends({}, Object.keys(fragments).map(function (key) { + return defineProperty({}, key, function () { + var _relay$environment$un = relay.environment.unstable_internal, + createFragmentSpecResolver = _relay$environment$un.createFragmentSpecResolver, + getDataIDsFromObject = _relay$environment$un.getDataIDsFromObject; - var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); - var nextIDs = getDataIDsFromObject(fragments, this.$props); - var resolver = this.state.resolver; + var prevIDs = getDataIDsFromObject(fragments, this.state.prevProps); + var nextIDs = getDataIDsFromObject(fragments, this.$props); - if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$3(prevIDs, nextIDs)) { - resolver.dispose(); - resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); + var resolver = this.state.resolver; - this.setState({ - data: resolver.resolve(), - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: { - isLoading: resolver.isLoading(), - environment: relay.environment - }, - resolver: resolver - }); - } else { - resolver.setProps(this.$props); + if (this.state.relayEnvironment !== relay.environment || this.state.relayVariables !== relay.variables || !areEqual$3(prevIDs, nextIDs)) { + resolver.dispose(); + resolver = createFragmentSpecResolver(relay, this.$options.name, fragments, this.$props, this._handleFragmentDataUpdate); - var data = resolver.resolve(); - if (data !== this.state.data) { this.setState({ - data: data, + data: resolver.resolve(), prevProps: this.$props, relayEnvironment: relay.environment, relayVariables: relay.variables, relayProp: { isLoading: resolver.isLoading(), environment: relay.environment - } + }, + resolver: resolver }); + } else { + resolver.setProps(this.$props); + + var data = resolver.resolve(); + if (data !== this.state.data) { + this.setState({ + data: data, + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: { + isLoading: resolver.isLoading(), + environment: relay.environment + } + }); + } } - } - }, + }); + })), beforeDestroy: function beforeDestroy() { this.state.resolver.dispose(); - }, - - methods: { - setState: function setState(state) { - this.state = Object.freeze(_extends({}, this.state, state)); - }, - _handleFragmentDataUpdate: function _handleFragmentDataUpdate() { - this.setState({ - data: this.state.resolver.resolve(), - relayProp: { - isLoading: this.state.resolver.isLoading(), - environment: this.state.relayProp.environment - } - }); - } } }; }; diff --git a/dist/vue-relay.min.js b/dist/vue-relay.min.js index 280750e..f2b2eab 100644 --- a/dist/vue-relay.min.js +++ b/dist/vue-relay.min.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e["vue-relay"]=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n ({ [key]: function () { const { createFragmentSpecResolver, getDataIDsFromObject @@ -85,26 +102,9 @@ const createContainerWithFragments = function (fragments) { }) } } - }, + } })) }, beforeDestroy () { this.state.resolver.dispose() - }, - methods: { - setState (state) { - this.state = Object.freeze({ - ...this.state, - ...state - }) - }, - _handleFragmentDataUpdate () { - this.setState({ - data: this.state.resolver.resolve(), - relayProp: { - isLoading: this.state.resolver.isLoading(), - environment: this.state.relayProp.environment - } - }) - } } } } diff --git a/src/VueRelayPaginationContainer.js b/src/VueRelayPaginationContainer.js index 2efb059..5640bb3 100644 --- a/src/VueRelayPaginationContainer.js +++ b/src/VueRelayPaginationContainer.js @@ -147,57 +147,6 @@ const createContainerWithFragments = function (fragments, connectionConfig) { }) } }, - beforeUpdate () { - const { - createFragmentSpecResolver, - getDataIDsFromObject - } = relay.environment.unstable_internal - - const prevIDs = getDataIDsFromObject(fragments, this.state.prevProps) - const nextIDs = getDataIDsFromObject(fragments, this.$props) - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if ( - this.state.relayEnvironment !== relay.environment || - this.state.relayVariables !== relay.variables || - !areEqual(prevIDs, nextIDs) - ) { - this._release() - - this.context.relay.environment = relay.environment - this.context.relay.variables = relay.variables - - const resolver = createFragmentSpecResolver( - relay, - this.$options.name, - fragments, - this.$props, - this._handleFragmentDataUpdate - ) - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver - }) - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props) - } - const data = this.state.resolver.resolve() - if (data !== this.state.data) { - this.setState({ data }) - } - }, - beforeDestroy () { - this._release() - }, methods: { setState (state) { this.state = Object.freeze({ @@ -492,6 +441,57 @@ const createContainerWithFragments = function (fragments, connectionConfig) { this.state.queryFetcher.dispose() } } + }, + watch: { ...Object.keys(fragments).map((key) => ({ [key]: function () { + const { + createFragmentSpecResolver, + getDataIDsFromObject + } = relay.environment.unstable_internal + + const prevIDs = getDataIDsFromObject(fragments, this.state.prevProps) + const nextIDs = getDataIDsFromObject(fragments, this.$props) + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if ( + this.state.relayEnvironment !== relay.environment || + this.state.relayVariables !== relay.variables || + !areEqual(prevIDs, nextIDs) + ) { + this._release() + + this.context.relay.environment = relay.environment + this.context.relay.variables = relay.variables + + const resolver = createFragmentSpecResolver( + relay, + this.$options.name, + fragments, + this.$props, + this._handleFragmentDataUpdate + ) + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver + }) + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props) + } + const data = this.state.resolver.resolve() + if (data !== this.state.data) { + this.setState({ data }) + } + } })) }, + beforeDestroy () { + this._release() } } } diff --git a/src/VueRelayQueryRenderer.js b/src/VueRelayQueryRenderer.js index 38db23f..73057c1 100644 --- a/src/VueRelayQueryRenderer.js +++ b/src/VueRelayQueryRenderer.js @@ -106,20 +106,22 @@ const fetchQueryAndComputeStateFromProps = function (props, queryFetcher, retryC } } +const props = { + cacheConfig: {}, + dataFrom: {}, + environment: { + required: true + }, + query: {}, + variables: { + type: Object, + default: () => ({}) + } +} + export default { name: 'relay-query-renderer', - props: { - cacheConfig: {}, - dataFrom: {}, - environment: { - required: true - }, - query: {}, - variables: { - type: Object, - default: () => ({}) - } - }, + props, data () { const handleDataChange = ({ error, snapshot }) => { this.setState({ renderProps: getRenderProps(error, snapshot, queryFetcher, retryCallbacks) }) @@ -154,16 +156,24 @@ export default { } }), state: Object.freeze({ - prevPropsEnvironment: this.$props.environment, - prevPropsVariables: this.$props.variables, - prevQuery: this.$props.query, + prevPropsEnvironment: this.environment, + prevPropsVariables: this.variables, + prevQuery: this.query, queryFetcher, retryCallbacks, ...state }) } }, - beforeUpdate () { + methods: { + setState (state) { + this.state = Object.freeze({ + ...this.state, + ...state + }) + } + }, + watch: { ...Object.keys(props).map((key) => ({ [key]: function () { if ( this.state.prevQuery !== this.query || this.state.prevPropsEnvironment !== this.environment || @@ -188,9 +198,12 @@ export default { ...state }) } - }, - beforeDestroy () { - this.state.queryFetcher.dispose() + } })) }, + render (h) { + if (process.env.NODE_ENV !== 'production') { + require('relay-runtime/lib/deepFreeze')(this.state.renderProps) + } + return h(this.component) }, created () { this.component = { @@ -207,18 +220,7 @@ export default { } } }, - render (h) { - if (process.env.NODE_ENV !== 'production') { - require('relay-runtime/lib/deepFreeze')(this.state.renderProps) - } - return h(this.component) - }, - methods: { - setState (state) { - this.state = Object.freeze({ - ...this.state, - ...state - }) - } + beforeDestroy () { + this.state.queryFetcher.dispose() } } diff --git a/src/VueRelayRefetchContainer.js b/src/VueRelayRefetchContainer.js index a7952b2..622202f 100644 --- a/src/VueRelayRefetchContainer.js +++ b/src/VueRelayRefetchContainer.js @@ -43,57 +43,6 @@ const createContainerWithFragments = function (fragments, taggedNode) { }) } }, - beforeUpdate () { - const { - createFragmentSpecResolver, - getDataIDsFromObject - } = relay.environment.unstable_internal - - const prevIDs = getDataIDsFromObject(fragments, this.state.prevProps) - const nextIDs = getDataIDsFromObject(fragments, this.$props) - - // If the environment has changed or props point to new records then - // previously fetched data and any pending fetches no longer apply: - // - Existing references are on the old environment. - // - Existing references are based on old variables. - // - Pending fetches are for the previous records. - if ( - this.state.relayEnvironment !== relay.environment || - this.state.relayVariables !== relay.variables || - !areEqual(prevIDs, nextIDs) - ) { - this._release() - - this.context.relay.environment = relay.environment - this.context.relay.variables = relay.variables - - const resolver = createFragmentSpecResolver( - relay, - this.$options.name, - fragments, - this.$props, - this._handleFragmentDataUpdate - ) - - this.setState({ - prevProps: this.$props, - relayEnvironment: relay.environment, - relayVariables: relay.variables, - relayProp: this._buildRelayProp(relay), - localVariables: null, - resolver - }) - } else if (!this.state.localVariables) { - this.state.resolver.setProps(this.$props) - } - const data = this.state.resolver.resolve() - if (data !== this.state.data) { - this.setState({ data }) - } - }, - beforeDestroy () { - this._release() - }, methods: { setState (state) { this.state = Object.freeze({ @@ -227,6 +176,57 @@ const createContainerWithFragments = function (fragments, taggedNode) { this.state.queryFetcher.dispose() } } + }, + watch: { ...Object.keys(fragments).map((key) => ({ [key]: function () { + const { + createFragmentSpecResolver, + getDataIDsFromObject + } = relay.environment.unstable_internal + + const prevIDs = getDataIDsFromObject(fragments, this.state.prevProps) + const nextIDs = getDataIDsFromObject(fragments, this.$props) + + // If the environment has changed or props point to new records then + // previously fetched data and any pending fetches no longer apply: + // - Existing references are on the old environment. + // - Existing references are based on old variables. + // - Pending fetches are for the previous records. + if ( + this.state.relayEnvironment !== relay.environment || + this.state.relayVariables !== relay.variables || + !areEqual(prevIDs, nextIDs) + ) { + this._release() + + this.context.relay.environment = relay.environment + this.context.relay.variables = relay.variables + + const resolver = createFragmentSpecResolver( + relay, + this.$options.name, + fragments, + this.$props, + this._handleFragmentDataUpdate + ) + + this.setState({ + prevProps: this.$props, + relayEnvironment: relay.environment, + relayVariables: relay.variables, + relayProp: this._buildRelayProp(relay), + localVariables: null, + resolver + }) + } else if (!this.state.localVariables) { + this.state.resolver.setProps(this.$props) + } + const data = this.state.resolver.resolve() + if (data !== this.state.data) { + this.setState({ data }) + } + } })) }, + beforeDestroy () { + this._release() } } } diff --git a/src/buildVueRelayContainer.js b/src/buildVueRelayContainer.js index 3eb30da..51a4809 100644 --- a/src/buildVueRelayContainer.js +++ b/src/buildVueRelayContainer.js @@ -17,6 +17,11 @@ const buildVueRelayContainer = function (component, fragmentSpec, createContaine return { name: 'relay-context-consumer', inject: ['relay'], + render (h) { + return h(this.component, { + props: this.$attrs + }) + }, created () { const relay = assertRelayContext(this.relay) const { getFragment: getFragmentFromTag } = relay.environment.unstable_internal @@ -27,6 +32,12 @@ const buildVueRelayContainer = function (component, fragmentSpec, createContaine this.component = { extends: createContainerWithFragments.call(this, fragments), props: Object.keys(fragments), + render (h) { + if (this.context) { + return h(this.component) + } + return this.component.render(h) + }, created () { this.component = { name: 'relay-context-provider', @@ -53,19 +64,8 @@ const buildVueRelayContainer = function (component, fragmentSpec, createContaine })) } } - }, - render (h) { - if (this.context) { - return h(this.component) - } - return this.component.render(h) } } - }, - render (h) { - return h(this.component, { - props: this.$attrs - }) } } }